如何使用 JDBC 在 ListView 或 TableView 中显示来自 SQL Server 的数据

Posted

技术标签:

【中文标题】如何使用 JDBC 在 ListView 或 TableView 中显示来自 SQL Server 的数据【英文标题】:How to display data from SQL Server in a ListView or TableView using JDBC 【发布时间】:2018-06-08 09:30:58 【问题描述】:

我已使用 JTDS v.1.2.8 连接到我的 SQL Server

我是 JDBC 插件的新手,我正在努力解决这个问题。我也确实在论坛上查看了相关的问题/答案,但我找不到,所以我在这里问:)

我想要实现的是,我想以更好的方式显示从 SQL 数据库中获取的数据,例如 listView 或 tableView。

这是我目前正在使用的代码,我真的不知道如何使它工作

Class Model
    public class Model

    public String nom;
    public String prenom;
    public String mail;
    public String tel;
    public String date;
    public String caissier;
    public String vendeur;
    public String estheticienne;;

    // Getters and Setters omitted



/////////////////////////////////////// ///////////////////////

 public class Magasin extends AppCompatActivity 
        ListView list;


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_magasin);


    Button btn = (Button) findViewById(R.id.btnData);
    btn.setOnClickListener(new View.OnClickListener()
        @Override
        public void onClick(View v) 
            GetData retrieveData = new GetData();
            retrieveData.execute("");

        
    );


private class GetData extends AsyncTask<String,String,String> 
    String msg = "";

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://" +
            DbStrings.DATABASE_URL + "/" + DbStrings.DATABASE_NAME;
    @Override
    protected void onPreExecute()
    
    @Override
    protected String doInBackground(String... params)
        Connection conn = null;
        Statement stmt = null;
        List<Model> list = new ArrayList<Model>();
        try 
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, DbStrings.USERNAME, DbStrings.PASSWORD);

            stmt = conn.createStatement();
            String sql = "SELECT * FROM login";
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();



            while (rs.next())
                Model utilisateur = new Model();
                utilisateur.prenom = rs.getString("prenom");
                utilisateur.nom = rs.getString("nom");
                utilisateur.mail = rs.getString("email");
                utilisateur.tel = rs.getString("tel");
                utilisateur.date = rs.getString("date");
                utilisateur.caissier = rs.getString("caissiere");
                utilisateur.vendeur = rs.getString("vendeuse");
                utilisateur.estheticienne = rs.getString("estheticienne");
                list.add(utilisateur);

            
            msg = "Données récupérées !";

            rs.close();
            stmt.close();
            conn.close();

         catch (SQLException connError)
            msg = "An exception was thrown for JDBC.";
            connError.printStackTrace();
         catch (ClassNotFoundException e) 
            msg = "A class not found exception was thrown.";
            e.printStackTrace();

        
        return msg;

    


非常感谢任何评论或回答指出我的解决方案。

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

不要在主线程上执行服务器操作,这是我项目中的代码

/*JDBC Connection URL*/
private static final String url = "jdbc:mysql://192.168.10.0:8000/etm";
/*JDBC Connection USER NAME*/
private static final String user = "admin";
/*JDBC Connection PASSWORD*/
private static final String pass = "admin";
/*ArrayList to store bus stop names*/
private static ArrayList<String> busStops;




private static class RetrieveSQL extends AsyncTask<Void, Void, ArrayList> 

        @Override
        protected ArrayList doInBackground(Void... voids) 
            try 
                Class.forName("com.mysql.jdbc.Driver");
             catch (Exception e) 
                System.err.println("Cannot create connection");
            
            Connection connection;
            busStops.clear();
            try 
                connection = DriverManager.getConnection(url, user, pass);
                Statement st = connection.createStatement();
                ResultSet rs = st.executeQuery("select * from stops");
                while (rs.next()) 
                    busStops.add(rs.getString("c_stop_name"));
                
             catch (Exception e) 
                System.err.println("Error");
            
            return busStops;
        

        @Override
        protected void onPostExecute(ArrayList busList) 
            super.onPostExecute(busList);
            mView.displayBusStopFromMySqlServer(busList);
        
    

onPostExecute() 将返回arraylist,将其传递给适配器。

使用 Recyclerview 而不是 Listview

【讨论】:

你说的是哪个适配器? 创建一个扩展 RecyclerView 的适配器 Example : BusAdapter mAdapter = new BusAdapter(busStops, MainActivity.this); recyclerView.setAdapter(mAdapter); in MainActivity【参考方案2】:

您应该创建一个带有内容行的 ListView,并在带有标题行的布局上方创建一个。并在布局上进行列划分,用于表示 ListView 上的每一行。

另一种方法是在滚动中创建一个 TableLayout!

【讨论】:

以上是关于如何使用 JDBC 在 ListView 或 TableView 中显示来自 SQL Server 的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android ListView上加粗Java中字符串的一部分?

如何在 Flutter 中添加 ListView.builder 的填充顶部?

Android + jdbc连接云服务器的MySQL并采用ListView查看数据

如何打印加入 JDBC 的 3 个表中的列名? [复制]

当另一个 View 或 Fragment 位于 ListView 上方时,如何防止 ListView 接收点击?

如何检测 ListView 或任何控件何时完成渲染?