我如何使用这个已经构建的数据库 class 像 Android 上的 "SELECT * FROM TABLE" 一样向我的数据库抛出查询?

How do I use this already built database class to throw queries to my DB like "SELECT * FROM TABLE" on Android?

所以我重新开始 Android 开发,仍然在重新了解一些东西,这是我第一次制作连接到服务器中的数据库的应用程序。

到目前为止,我已经使用此代码连接到服务器,它通过显示“连接是真实的”来工作

我现在唯一想知道的是如何使用相同的 class 来抛出查询来执行诸如“SELECT * FROM TABLE”等操作

我知道通过直接连接到数据库来做我正在做的事情是不好的做法,但这只是一个非常小的应用程序,不会做重要的事情,只是为了让我能更好地理解 Android.

package com.example.databasetest;

    import java.sql.Connection;
    import java.sql.DriverManager;
    
    public class Database {
    
        private Connection connection;
    
        private final String host = "xxxxx";
        private final String database = "xxxx";
        private final int port = "xxxx";
        private final String user = "xxxx";
        private final String pass = "xxxx";
        private String url = "jdbc:postgresql://%s:%d/%s";
        private boolean status;
    
        public Database() {
            this.url = String.format(this.url, this.host, this.port, this.database);
            connect();
            //this.disconnect();
            System.out.println("connection status:" + status);
        }
    
        private void connect() {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Class.forName("org.postgresql.Driver");
                        connection = DriverManager.getConnection(url, user, pass);
                        status = true;
                        System.out.println("connected:" + status);
                    } catch (Exception e) {
                        status = false;
                        System.out.print(e.getMessage());
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            try {
                thread.join();
            } catch (Exception e) {
                e.printStackTrace();
                this.status = false;
            }
        }
    
        public Connection getExtraConnection(){
            Connection c = null;
            try {
                Class.forName("org.postgresql.Driver");
                c = DriverManager.getConnection(url, user, pass);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return c;
        }
    }

这是我的 MainActivity:

package com.example.databasetest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val db = Database()


    }
}

编辑:

好的,所以我尝试将“private void connect()”函数复制到“public void load()”函数中,该函数向数据库发送 sql 查询。

public void load() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Connection con;
                    Statement stmt;
                    String sql = "SELECT * FROM INVENTORY";

                    Class.forName("org.postgresql.Driver");
                    con = DriverManager.getConnection(url, user, pass);

                    stmt = con.createStatement();
                    ResultSet rs = stmt.executeQuery(sql);

                    while (rs.next()){

                        int id = rs.getInt("ID");
                        String description = rs.getString("DESCRIPTION");
                        String amount = rs.getString("AMOUNT");
                        String local = rs.getString("LOCAL");

                        System.out.print("ID: "+id);
                        System.out.print("Description: "+description);
                        System.out.print("Amount: "+amount);
                        System.out.print("Local: "+local);

                    con.close();
                    }

                } catch (Exception e) {
                    status = false;
                    System.out.print(e.getMessage());
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
            this.status = false;
        }
    }

现在的问题是在Logcat中出现这个警告:

"I/Choreographer: 跳过 83 帧!应用程序可能在其主线程上做了太多工作。"

它曾经工作过一次,但现在它只给我这个错误。数据库甚至没有那么多信息,大约有 12 行。

如何在访问数据库时多线程(?)这个函数?

这是我在 MainActivity 中调用 db.load() 的地方:

override fun onOptionsItemSelected(item: MenuItem): Boolean {

        val id = findViewById<EditText>(R.id.ID)

        return when (item.itemId) {
            R.id.load -> {
                val db = Database()

                db.load()

                true
            }

您已经获得 Connection 的实例,Connection 是否包含执行 SQL 查询(或诸如此类)的方法?

public class Database {
... 
    public Cursor query(String sql) { //cursor is nullable
        // TODO connection.xxxx
    }
}

在classMainActivity中,可以访问方法查询获取Cursor...

[更新]

public class 数据库 {

private Connection connection;

private final String host = "xxxxx";
private final String database = "xxxx";
private final int port = 9999;//needs int
private final String user = "xxxx";
private final String pass = "xxxx";
private final String SQL_DRIVER = "org.postgresql.Driver";
private String url = "jdbc:postgresql://%s:%d/%s";
private boolean status;

public Database() {
    this.url = String.format(this.url, this.host, this.port, this.database);
    System.out.println("the final url is " + this.url);
}

public Connection getConnection() {
    Connection c = null;
    try {
        Class.forName(SQL_DRIVER);
        c = DriverManager.getConnection(url, user, pass);
        status = true;
        System.out.println("connected:" + status);
    } catch (Exception e) {
        status = false;
        System.out.print(e.getMessage());
        e.printStackTrace();
    }

    return c;
}

public void load() {
    Thread thread = new Thread(new Runnable() {
        Connection con;
        @Override
        public void run() {
            try {
                Statement stmt;
                String sql = "SELECT * FROM INVENTORY";
                Class.forName(SQL_DRIVER);
                con = DriverManager.getConnection(url, user, pass);
                stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                status = true;

                while (rs.next()) {
                    int id = rs.getInt("ID");
                    String description = rs.getString("DESCRIPTION");
                    String amount = rs.getString("AMOUNT");
                    String local = rs.getString("LOCAL");

                    System.out.print("ID: " + id);
                    System.out.print("Description: " + description);
                    System.out.print("Amount: " + amount);
                    System.out.print("Local: " + local);
                }
            } catch (Exception e) {
                try {
                    con.close();
                } catch (SQLException exp) {
                    exp.printStackTrace();
                }
                status = false;
                System.out.print(e.getMessage());
                e.printStackTrace();
            }
        }
    });

    thread.start();

    // try to comment
    //try {
    //    thread.join();
    //} catch (Exception e) {
    //    e.printStackTrace();
    //    this.status = false;
    //}
}

}