1、创建一个新的安卓项目,选择Empty Activity模板。
2、在activity_main.xml文件中添加一个EditText用于输入SQL语句,一个Button用于执行查询,一个TextView用于显示查询结果。
3、在MainActivity.java文件中编写按钮点击事件,实现查询功能。
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MainActivity extends AppCompatActivity { private EditText etSql; private Button btnQuery; private TextView tvResult; private static final String DB_URL = "jdbc:mysql://localhost:3306/test"; // 数据库地址和端口号,根据实际情况修改 private static final String USER = "root"; // 数据库用户名,根据实际情况修改 private static final String PASSWORD = "123456"; // 数据库密码,根据实际情况修改 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etSql = findViewById(R.id.et_sql); btnQuery = findViewById(R.id.btn_query); tvResult = findViewById(R.id.tv_result); btnQuery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String sql = etSql.getText().toString(); // 获取输入的SQL语句 try { Class.forName("com.mysql.jdbc.Driver"); // 加载驱动类 Connection connection = DriverManager.getConnection(DB_URL, USER, PASSWORD); // 建立数据库连接 Statement statement = connection.createStatement(); // 创建Statement对象,用于执行SQL语句 ResultSet resultSet = statement.executeQuery(sql); // 执行查询,获取结果集 StringBuilder result = new StringBuilder(); // 用于存储查询结果的字符串拼接器 while (resultSet.next()) { // 遍历结果集,将每一行数据拼接到result中 for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) { // 获取列数,从第1列开始拼接数据,因为第1列是表头,不需要拼接到结果中 result.append(resultSet.getString(i)).append("\t"); // 拼接数据,用制表符分隔每个字段的值,最后一个字段后不添加制表符 } result.append(""); // 每拼接完一行数据,添加一个换行符,方便查看结果 } tvResult.setText(result.toString()); // 将查询结果显示在TextView中,关闭数据库连接和Statement对象(自动关闭) } catch (Exception e) { // 捕获异常,输出错误信息到Logcat中,方便调试问题所在位置和原因,避免程序崩溃或出现未知错误情况的发生,e是Throwable类型的变量,可以接收任何类型的异常信息,这里只打印了异常的堆栈信息,如果需要更详细的异常信息,可以使用e的getMessage()方法获取异常的具体描述信息,注意:不要使用e来处理异常,因为这样会丢失异常的详细信息,应该使用trycatch块来捕获异常并处理它,否则,如果出现异常,程序将无法正常执行下去,也要注意不要在catch块中使用throw关键字抛出新的异常,这样做会导致原来的异常被忽略掉,而且也无法得到正确的异常信息,最好的做法是在catch块中记录异常信息或者向上层调用者传递异常信息,如果需要重新抛出异常,可以使用RuntimeException包装一下原始的异常对象再抛出去,这样可以保留原始的异常信息,同时也不会影响程序的正常执行流程,如果需要向上层调用者传递异常信息,可以使用回调函数或者观察者模式来实现,这样可以避免在代码中直接使用trycatch块来处理异常的情况发生,同时也可以保证程序的稳定性和可靠性,另外需要注意的是:在使用trywithresources语句时,不需要显式地关闭资源对象,因为trywithresources语句会自动关闭实现了AutoCloseable接口的资源对象,如果没有实现该接口的资源对象需要手动关闭的话,可以在finally块中关闭它们,但是需要注意:finally块中的代码只有在try块中的代码执行成功时才会执行,如果try块中的代码出现了异常情况导致程序跳转到了catch块中执行的话,那么finally块中的代码就不会被执行了,最好的做法是将需要关闭的资源对象放在trywithresources语句中进行管理,这样可以避免忘记关闭资源对象而导致的问题发生,同时也可以简化代码结构,提高代码的可读性和可维护性,对于没有实现AutoCloseable接口的资源对象来说,可以使用tryfinally语句来确保它们能够被正确地关闭掉,InputStream is = null; try { is = new FileInputStream("file path"); ... } finally { if (is != null) { is.close(); } } } catch (Exception e) { LogUtils.e("MainActivity", e); } } catch (ClassNotFoundException e) { LogUtils.e("MainActivity", e); } } catch (SQLException e) { LogUtils.e("MainActivity", e); } } finally { try { if (connection != null) { connection.close(); } if (statement != null) { statement.close(); } } catch (SQLException e) { LogUtils.e("MainActivity", e); } } } finally { try { if (resultSet != null) { resultSet.close(); } } catch (SQLException e) { LogUtils.e("MainActivity", e); } } } finally { try { if (driver != null) { driverManager.registerDriver(driver); } } catch (SQLException e) { LogUtils.e("MainActivity", e); } } }}}
序号 | 安卓端操作/设置 | Windows端操作/设置 | |
1 | 数据库连接 | 使用 JDBC 驱动连接 MySQL 数据库 | 使用 Navicat 等 GUI 工具连接 |
2 | 创建数据库 | 使用 SQLiteOpenHelper 创建本地数据库 | 使用 MySQL 命令创建远程数据库 |
3 | 查询数据 | 使用 SQL 语句通过 JDBC 执行查询 | 在 Navicat 中编写查询或使用命令行 |
4 | 数据增删改 | 使用 ContentValues 和 SQL 语句 | 在 Navicat 中操作或使用命令行 |
5 | 开启远程连接 | 配置数据库和网络安全设置 | 修改 MySQL 配置文件并重启服务 |
... | ... | ... | ... |
以下是根据您提供的信息,补充完整的介绍内容:
序号 | 安卓端操作/设置 | Windows端操作/设置 | |
1 | 数据库连接 | 使用Class.forName("com.mysql.jdbc.Driver") 加载驱动,使用DriverManager.getConnection() 方法连接 | 在 Navicat 中配置服务器地址、端口、用户名和密码进行连接 |
2 | 创建数据库 | 通过继承SQLiteOpenHelper 类并在onCreate() 中编写创建表的 SQL 语句 | 使用 MySQL 命令如CREATE DATABASE 在命令行或 Navicat 中创建 |
3 | 查询数据 | 使用SQLiteDatabase.rawQuery() 或Cursor 进行查询 | 在 Navicat 中编写 SQL 查询或在命令行中使用SELECT 语句 |
4 | 数据增删改 | 通过ContentValues 和SQLiteDatabase.insert() ,update() ,delete() 进行操作 | 使用 SQL 语句INSERT ,UPDATE ,DELETE 在命令行或 Navicat 中操作 |
5 | 开启MySQL的远程连接 | 配置数据库允许远程访问,使用正确的 IP 地址和端口号 | 修改 MySQL 配置文件my.cnf ,添加bindaddress = 0.0.0.0 ,重启 MySQL 服务 |
6 | 数据库安全配置 | 在 AndroidManifest.xml 中配置网络权限
| 通过防火墙设置和 MySQL 用户权限管理进行安全配置 |
请注意,在实际开发中,出于性能和安全性考虑,通常不建议在 Android 应用程序中直接连接远程 MySQL 数据库,而是通过后端服务进行数据交互。