移动端疫情展示

要求开发一款移动端的全世界疫情实时查询系统。

要求将前两周的项目合并为一个完整的项目。

采用统一的数据库。(建议MySQL数据库)

实现从数据采集、数据存储、数据查询(WEB端和移动端)一体全世界实时疫情查询系统。

以本机数据库为服务器端,web端和移动端连接远程数据库实现数据共享,要求数据库表格式统一化。

查询显示当前最新时间的数据,可以查询任一时间任一地点的数据。该系统要求在服务器端发布,可以通过IP地址访问

 

思路:安卓客户端远程访问数据库得到数据后进行展示

源程序代码:

dao层:

package com.itheima.worldepidemic.db;

import android.util.Log;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 数据库工具类:连接数据库用、获取数据库数据用
 * 相关操作数据库的方法均可写在该类
 */
public class DBUtil {


    private static String driver = "com.mysql.jdbc.Driver";// MySql驱动

//    private static String url = "jdbc:mysql://localhost:3306/map_designer_test_db";
    private static String user = "root";// 用户名

    private static String password = "123";// 密码



    private static Connection getConn(String dbName){


        Connection connection = null;
        try{
            Class.forName(driver);// 动态加载类
            String ip = "49.235.116.180";// 写成本机地址,不能写成localhost,同时手机和电脑连接的网络必须是同一个

            // 尝试建立到给定数据库URL的连接
            connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
                    user, password);

        }catch (Exception e){
            e.printStackTrace();
        }

        return connection;
    }

    public static String getInfoByName(String time,String country){
        JSONArray jsonArray=new JSONArray();
        // 根据数据库名称,建立连接
        Connection connection = getConn("epidemic");

        try {
            // mysql简单的查询语句。这里是根据MD_CHARGER表的NAME字段来查询某条记录
            String sql = "select * from world where date_format(Date,'%Y-%m-%d') = ? and country = ? and child !='2' order by Confirmed_num desc";
//            String sql = "select * from MD_CHARGER";
            if (connection != null){// connection不为null表示与数据库建立了连接
                PreparedStatement ps = connection.prepareStatement(sql);
                if (ps != null){
                    // 设置上面的sql语句中的?的值为name
                    ps.setString(1, time);
                    ps.setString(2,country);
                    // 执行sql查询语句并返回结果集
                    ResultSet rs = ps.executeQuery();
                    if (rs != null){

                        while (rs.next()){
                            JSONObject json=new JSONObject();
                            String place=rs.getString("Country");
                            String province=rs.getString("Province");
                            if(province==null||province.equals(""))
                                province="";
                            String confirmed_num=""+rs.getInt("Confirmed_num");
                            String yisi_num=rs.getString("Yisi_num");
                            String cured_num=rs.getString("Cured_num");
                            String dead_num=rs.getString("Dead_num");
                            json.put("country",place);
                            json.put("province", province);
                            json.put("confirmed_num", confirmed_num);
                            json.put("yisi_num", yisi_num);
                            json.put("cured_num", cured_num);
                            json.put("dead_num", dead_num);
                            jsonArray.add(json);
                        }

                    }else {
                        return null;
                    }
                }else {
                    return  null;
                }
            }else {
                return  null;
            }
        }catch (Exception e){
            e.printStackTrace();
            Log.e("DBUtils","异常:" + e.getMessage());
            return null;
        }
        return jsonArray.toString();
    }

}

 

显示数据:

package com.itheima.worldepidemic;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.itheima.worldepidemic.db.DBUtil;

public class MainActivity extends AppCompatActivity {
    private TextView date;
    private TextView country;
    private Button btn;
    private TextView tv_data;
    private String str;
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler( ) {
        @Override
        public void handleMessage(Message msg) {
            tv_data=findViewById(R.id.tv_data);
            tv_data.setMovementMethod(ScrollingMovementMethod.getInstance());
            switch (msg.what) {
                case 0x11:
                    str= (String) msg.obj;
                    tv_data.setText(str);
                    break;

                case 0x12:
                    String str1 = (String) msg.obj;
                    tv_data.setText(str1);
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + msg.what);
            }

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        date = findViewById(R.id.time);
        country = findViewById(R.id.country);
        country.setText("伊朗");
        btn = findViewById(R.id.btn);
        query( );

    }


    public void query() {

        btn.setOnClickListener(new View.OnClickListener( ) {
            @Override
            public void onClick(View v) {
                // 创建一个线程来连接数据库并获取数据库中对应表的数据
                new Thread(new Runnable( ) {
                    @Override
                    public void run() {
                        // 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
                        String result = DBUtil.getInfoByName(date.getText( ).toString( ), country.getText( ).toString( ));
                        JSONArray jsonArray= (JSONArray) JSON.parse(result);
                        Message message = handler.obtainMessage( );
                        if (jsonArray!= null) {
                            String s = "";
                            for(int i=0;i<jsonArray.size();i++) {
                                JSONObject json = jsonArray.getJSONObject(i);
                                s = s + json.getString("country") + " " + json.getString("province") + " "
                                        + "确诊:" + json.getString("confirmed_num") + "疑似:" + json.getString("yisi_num") + "治愈:"
                                        + json.getString("cured_num") + "死亡:" + json.getString("dead_num") + "\n";
                            }
                            message.what = 0x12;
                            message.obj = s;
                        } else {
                            message.what = 0x11;
                            message.obj = "查询结果为空";
                        }
                        // 发消息通知主线程更新UI
                        handler.sendMessage(message);
                    }
                }).start( );


            }
        });
    }


}

 

界面代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="时间:"
        android:textSize="16sp"
        android:textColor="@color/colorAccent"
        />
    <EditText
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="例如2020-03-22"
        android:inputType="text"
        android:maxLines="1"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="地区:"
        android:textSize="16sp"
        android:textColor="@color/colorAccent"
        />
    <EditText
        android:id="@+id/country"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="例如中国"
        android:maxLines="1"
        android:inputType="text"
        />
    </LinearLayout>
    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询"
        android:layout_gravity="center_horizontal"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/tv_data"
        android:padding="10dp"
        android:textSize="16sp"
        android:gravity="center"
        android:text="结果显示区"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="300dp" />
</LinearLayout>

 

运行结果截图:

 

posted @ 2020-03-21 15:34  一粒盐  阅读(151)  评论(0编辑  收藏  举报