安卓开发接入MySQL数据库,对MySQL数据库进行基本操作

先看看我们的数据库
MQTTDATA,test2
我们要做的就是安卓app读取以上数据并显示部分数据

0,导入mysql-connector-java-5.1.28.jar到Androidstudio的lib文件夹下

jar包下载链接:链接:https://pan.baidu.com/s/1cNneqg1Ll4fTrEUd9EJFAA
提取码:lco3

1,写一个ESP8266类来装载数据库的数据

这是一个简单的类,我的想法是一行数据包括可变和固定数据,我用一个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;
    }
}

2,再写一个DBUtils.java的类,实现对MySQL的具体操作

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;
        }

    }

}

3.看看MainActivity

在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);
        //初始化短按键功能

        //初始化长按功能
        
    }

4,最后附上我的list_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;
    }

}

5,效果如图,根据获取的设备数据进行展示

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44821644/article/details/100943884
今日推荐