上一篇
安卓开发如何进行数据库查询
- 行业动态
- 2025-04-22
- 3
Android数据库基础
Android平台默认支持SQLite轻量级数据库,开发者可通过SQLiteOpenHelper
类实现数据库创建与版本管理,主流数据库操作包含:创建表、增删改查(CRUD)、事务处理、索引优化等。
原生SQLite数据库查询流程
步骤 | 关键方法 |
---|---|
创建DB | SQLiteOpenHelper 子类(如MyDBHelper)重写onCreate() 创建表结构 |
获取实例 | MyDBHelper helper = new MyDBHelper(context); |
读写模式 | SQLiteDatabase db = helper.getReadableDatabase(); |
执行查询 | Cursor cursor = db.query(TABLE_NAME, columns, selection, args, ...); |
解析数据 | 遍历cursor 对象提取字段值 |
关闭资源 | cursor.close(); db.close(); |
示例代码:
// 查询users表中age>20的所有记录 Cursor cursor = db.query( "users", // 表名 new String[]{"id", "name"}, // 列名数组 "age > ?", // where条件 new String[]{"20"}, // where参数 null, // groupBy null, // having "id DESC" // orderBy ); while (cursor.moveToNext()) { int id = cursor.getInt(0); String name = cursor.getString(1); }
Room持久化库高级查询
Room是Google推荐的抽象层,通过注解处理器生成编译时安全代码,主要组件:
- Entity:定义数据表结构
- DAO:包含数据访问方法
- Database:继承RoomDatabase的抽象类
DAO接口示例:
@Dao public interface UserDao { @Query("SELECT FROM user WHERE age > :minAge") List<User> getUsersByAge(int minAge); @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(User... users); }
链式调用查询:
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build(); List<User> users = db.userDao().getUsersByAge(21);
异步处理方案
数据库操作需避免阻塞主线程,常见解决方案:
- AsyncTask(已过时,建议新项目使用其他方案)
- ExecutorService:
Executors.newSingleThreadExecutor().execute(() -> { // 数据库操作 });
- LiveData(Room特有):
LiveData<List<User>> liveUsers = userDao.getUsersByAge(21); liveUsers.observe(this, users -> { / 更新UI / });
复杂查询场景处理
需求 | 实现方案 |
---|---|
多表关联查询 | SQL JOIN 语句或Room的@Transaction 注解 |
分页查询 | LIMIT 和OFFSET 配合,或使用PagingSource |
动态条件查询 | 原始SQL拼接或Room的@RawQuery |
实时监听数据变化 | ContentObserver或Room的InvalidationTracker |
注意事项
- 数据库关闭:每次操作后必须调用
db.close()
释放资源 - 线程安全:多线程访问需加锁或使用
synchronized
- 版本迁移:通过
SQLiteOpenHelper.onUpgrade()
处理结构变更 - 性能优化:为高频查询字段创建索引(
CREATE INDEX
)
相关问题与解答
Q1:如何实现数据库版本升级时的表结构变更?
A1:在SQLiteOpenHelper.onUpgrade()
方法中执行ALTER TABLE
语句,或删除旧表重建新表,推荐使用迁移工具库如sqlite-migrate-helper
。
Q2:Room如何实现复杂关联查询?
A2:使用@Transaction
注解包裹多个DAO方法,或编写@RawQuery
执行原生SQL。
@Transaction @Query("SELECT FROM orders WHERE user_id = :userId") List<Order> getOrdersWithUser(String userId);