赞
踩
先看看我们的数据库
我们要做的就是安卓app读取以上数据并显示部分数据
jar包下载链接:链接:https://pan.baidu.com/s/1cNneqg1Ll4fTrEUd9EJFAA
提取码:lco3
这是一个简单的类,我的想法是一行数据包括可变和固定数据,我用一个hashmap来存放可变数据。
可变数据就是它可以是temperature,也可以是on_off。
而固定数据是每行数据所必须的,包括设备的id,app的id,数据产生的时间,设备的类型,设备的网络状态,设备的备注信息
public class ESP8266 {
String app_id,device_id,state,type,remark,time;
int id;
HashMap data=new HashMap();
public int getId(){
return id;
}
public String getApp_id(){
return app_id;
}
public String getDevice_id(){
return device_id;
}
public String getState(){
return state;
}
public String getType(){
return type;
}
public String getRemark(){
return remark;
}
public String getTime(){
return time;
}
public Map getData() {
return data;
}
}
public class DBUtils {
static List<ESP8266> ESPlist=new ArrayList<>();//存放设备的数组
private static ESP8266 Device=new ESP8266();//初始化数组
private static String driver = "com.mysql.jdbc.Driver";// MySql驱动,需要驱动才能接入MySQL
// private static String url = "jdbc:mysql://localhost:3306/map_designer_test_db";
private static String user = "app";// 数据库的用户名
private static String password = "123456";//用户名对应的 密码
//连接数据库的函数
private static Connection getConn(String dbName){
Connection connection = null;
try{
Class.forName(driver);// 动态加载类
String ip = "118.31.20.121";// 这是MySQL服务器的地址,因为我买的是云主机,所以这里填的是云主机的公网地址
// 尝试建立到给定数据库URL的连接,连接格式:驱动名称+ip地址+端口号+数据库名称+用户名+密码
connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
user, password);
//Log.e("prx","url: "+"jdbc:mysql://" + ip + ":3306/" + dbName);3306为MySQL接入固定端口
}catch (Exception e){
e.printStackTrace();
}
return connection;
}
public static List<ESP8266> getInfoByID(String ID){
// 根据数据库名称,建立连接
Connection connection = getConn("MQTTDATA");
try {
// mysql简单的查询语句。可以使用查询,更新,删除等等,?是一个变量,在后面可以对?进行赋值,可以设置多个?
String sql = "select * from test2 where app_id=?";
if (connection != null){
// connection不为null表示与数据库建立了连接
//预编译sql 的,例如 preparedStatement("select * from t where id = ?");
//然后传入参数的时候 ? 就会替换成你所需要的参数。
PreparedStatement ps = connection.prepareStatement(sql);
if (ps != null){
// 设置上面的sql语句中第一个?的值为ID,如果有两个?,就再写一个ps.setString(2,String),
// ?会被替换成ID所代表的值
ps.setString(1, ID);
// 执行sql查询语句并返回结果集 resultset 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet rs = ps.executeQuery();
//Log.e("prx","结果集:" + rs);
if (rs != null){
//如果结果集不为空,先获取列的总数
int count = rs.getMetaData().getColumnCount();
Log.e("prx","列总数:" + count);
//int x=0;
// ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,
// 并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。
while (rs.next()){
// 注意:下标是从1开始的
for (int i = 1;i <= count;i++){
//获取数据表的列的名称
String field = rs.getMetaData().getColumnName(i);
//Log.e("esp","键: "+field);
Log.e("prx","值: "+rs.getString(field));
//通过键值来赋值给对应的ESP8266的元素
switch (field){
case "id":
Device.id=rs.getInt(field);
case "app_id":
Device.app_id=rs.getString(field);
break;
case "device_id":
Device.device_id=rs.getString(field);
break;
case "remark":
Device.remark=rs.getString(field);
break;
case "state":
Device.state=rs.getString(field);
break;
case "type":
Device.type=rs.getString(field);
break;
case "time":
Device.time=rs.getString(field);
break;
default:Device.data.put(field,rs.getString(field));
}
}
//把每个设备的保存到数组中
ESPlist.add(Device);
//注意每次都要重新实例化Device!!!
Device=new ESP8266();
//Log.e("esp","x="+x+" DEVICE_id"+Device.getDevice_id());
//ESP8266 ESP=ESPlist.get(x);
//Log.e("esp",x+" LIST_ID"+ESP.getDevice_id());
//x++;
//Log.e("ESP", String.valueOf(ESPlist.size()));
//x=x+1;
//Log.e("esp","list "+x);
}
//关闭数据库连接
connection.close();
ps.close();
//ESP8266 ESP=ESPlist.get(3);
//Log.e("esp","LIST_ID"+ESP.getDevice_id());
return ESPlist;
}else {
return null;
}
}else {
return null;
}
}else {
return null;
}
}catch (Exception e){
e.printStackTrace();
Log.e("prx","异常:" + e.getMessage());
return null;
}
}
}
在oncreate方法里开启新线程来读取数据库数据,通过1234(这里暂时设1234为appid)来读取数据库中appid为1234的所有数据DBUtils.getInfoByID(“1234”)返回的是一个数组。通过handler把消息告诉主线程,主线程再根据设备集合对listview进行初始化
List<ESP8266> deviceslist=new ArrayList<>();//存放设备集合
List_Adapter adapter=null;
private ListView mlistview;//列表视图
new Thread(new Runnable() {
@Override
public void run() {
// 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
deviceslist=DBUtils.getInfoByID("1234");
//把得到设备集合的信息通知到主线程
Message message = handler.obtainMessage();
if (!deviceslist.isEmpty()){
message.what=0x11;
handler.sendMessage(message);
}
}
}).start();
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0x11:
//获得设备集合,开始列表初始化
Initlistview();
break;
case 0x12:
break;
}
}
};
private void Initlistview() {
//初始化视图
adapter=new List_Adapter(MainActivity.this,deviceslist);
mlistview.setAdapter(adapter);
//初始化短按键功能
//初始化长按功能
}
public class List_Adapter extends BaseAdapter {
private List<ESP8266> list;
private Context mcontext;
private LayoutInflater mlayoutinflater;
public List_Adapter (Context context,List<ESP8266> list){
this.list=list;
this.mcontext=context;
mlayoutinflater= (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//完成赋值
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("list","enter adapter");
ESP8266 device=list.get(position);
viewholder holder=null; //创建一个中转站
if (convertView==null){ //如果有新项目移入屏幕
convertView=mlayoutinflater.inflate(R.layout.list_layout,null);//就给他加载内容
holder=new viewholder();
holder.imageView=convertView.findViewById(R.id.list_iv);//把控件地址赋值给holder
holder.textView1=convertView.findViewById(R.id.list_tv1);
holder.textView2=convertView.findViewById(R.id.list_tv2);
convertView.setTag(holder); //绑定项目视图和holder
}
else{
holder=(viewholder) convertView.getTag();
}
//设置备注为设备的名称
holder.textView1.setText(device.getRemark());
//Log.e("state",device.getState());
//显示设备状态
if (device.getState().equals("online")){
holder.textView2.setText("在线");
}else if (device.getState().equals("offline")){
holder.textView2.setText("离线");
}
else holder.textView2.setText("错误!");
//根据设备类型设置相应图片
switch (device.getType()) {
case "aircondition":
holder.imageView.setImageResource(R.drawable.aircon);
break;
case "light":
holder.imageView.setImageResource(R.drawable.light1);
break;
case "sensor":
holder.imageView.setImageResource(R.drawable.sensor2);
}
return convertView;
}
static class viewholder{ //暂时储存数据,中转站
public ImageView imageView;
public TextView textView1,textView2;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。