上一篇
安卓开发如何查询数据库连接
- 行业动态
- 2025-04-22
- 3066
本地数据库查询(以SQLite为例)
创建数据库帮助类
使用SQLiteOpenHelper
创建数据库和表结构:
public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表语句 db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 更新表逻辑 } }
执行查询操作
// 获取可读数据库 SQLiteDatabase db = helper.getReadableDatabase(); // 查询语句 Cursor cursor = db.rawQuery("SELECT FROM users WHERE id = ?", new String[]{"1"}); // 遍历结果 if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); // 处理数据 } while (cursor.moveToNext()); } cursor.close(); // 必须关闭游标
使用Room持久库(推荐方式)
// 定义实体 @Entity public class User { @PrimaryKey() public int id; public String name; } // 定义DAO @Dao public interface UserDao { @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); } // 使用方式 AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build(); User user = db.userDao().getUserById(1);
远程数据库查询(以MySQL为例)
配置网络权限
在AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.INTERNET" />
使用网络库发送请求
// Retrofit示例 public interface ApiService { @GET("users") Call<List<User>> getUsers(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService api = retrofit.create(ApiService.class); Call<List<User>> call = api.getUsers(); call.enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful()) { // 处理数据 } } @Override public void onFailure(Call<List<User>> call, Throwable t) { // 处理错误 } });
常见问题与解决方案
问题现象 | 解决方案 |
---|---|
数据库连接失败 | 检查网络权限、服务器地址、防火墙设置 |
主线程操作数据库 | 使用AsyncTask 或ExecutorService 处理耗时操作 |
SQLite数据库文件不存在 | 确认SQLiteOpenHelper 的onCreate 方法被调用 |
远程查询返回空数据 | 检查网络请求参数、服务器接口是否正常响应 |
相关问题与解答
问题1:如何更新本地数据库中的数据?
解答:
使用SQLiteDatabase.update()
方法或Room的@Update
注解。
// SQLite方式 ContentValues values = new ContentValues(); values.put("name", "New Name"); db.update("users", values, "id = ?", new String[]{"1"}); // Room方式 @Dao public interface UserDao { @Update void updateUser(User user); }
问题2:如何处理多线程并发查询?
解答:
- 本地数据库操作建议在子线程执行,避免阻塞UI
- 使用
synchronized
关键字保证线程安全 - Room库自带线程处理机制,自动在后台线程执行查询
- 远程查询需配合
LiveData
或RxJava
实现异步响应式