当前位置:首页 > 行业动态 > 正文

安卓开发如何进行数据库查询

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);

异步处理方案

数据库操作需避免阻塞主线程,常见解决方案:

  1. AsyncTask(已过时,建议新项目使用其他方案)
  2. ExecutorService
    Executors.newSingleThreadExecutor().execute(() -> {
        // 数据库操作
    });
  3. LiveData(Room特有):
     LiveData<List<User>> liveUsers = userDao.getUsersByAge(21);
     liveUsers.observe(this, users -> { / 更新UI / });

复杂查询场景处理

需求 实现方案
多表关联查询 SQL JOIN语句或Room的@Transaction注解
分页查询 LIMITOFFSET配合,或使用PagingSource
动态条件查询 原始SQL拼接或Room的@RawQuery
实时监听数据变化 ContentObserver或Room的InvalidationTracker

注意事项

  1. 数据库关闭:每次操作后必须调用db.close()释放资源
  2. 线程安全:多线程访问需加锁或使用synchronized
  3. 版本迁移:通过SQLiteOpenHelper.onUpgrade()处理结构变更
  4. 性能优化:为高频查询字段创建索引(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);
0