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

安卓开发数据库增删改查

数据库选择与准备

安卓开发中常用的本地数据库方案包括 SQLiteRoom(基于SQLite的高级抽象框架),Room 提供了更简洁的 API 和编译时校验,建议优先使用。

依赖配置

// 添加 Room 依赖(Kotlin 版)
implementation "androidx.room:room-runtime:2.5.1"
kapt "androidx.room:room-compiler:2.5.1"

实体类定义(以用户表为例)

@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val name: String,
    val age: Int
)

增删改查实现

增(Insert)

Room 实现
通过 @Dao 定义插入方法,支持单个或批量插入。

操作类型 代码示例 说明
单条插入 @Insert suspend fun insertUser(user: User) 需在协程中调用
批量插入 @Insert suspend fun insertUsers(users: List<User>) 返回长整型数组表示行号

SQLite 实现
需手动编写 SQL 语句并执行。

// 获取可写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
db.insert("user", null, values);

查(Select)

Room 实现
通过 @Query 定义查询,支持返回 LiveData 或 Flowable 实现异步监听。

操作类型 代码示例 说明
单表查询 @Query("SELECT FROM user") fun getAllUsers(): LiveData<List<User>> 数据变更时自动通知
条件查询 @Query("SELECT FROM user WHERE id = :userId") fun getUserById(userId: Int): User 参数绑定防止 SQL 注入

SQLite 实现
需手动拼接 SQL 并解析结果。

安卓开发数据库增删改查  第1张

Cursor cursor = db.query("user", null, "age > ?", new String[]{"20"}, null, null, null);
if (cursor.moveToFirst()) {
    do {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        // 处理数据...
    } while (cursor.moveToNext());
}

改(Update)

Room 实现
通过 @Update 注解自动生成更新语句,支持批量更新。

操作类型 代码示例 说明
单条更新 @Update suspend fun updateUser(user: User) 根据主键更新
批量更新 @Update suspend fun updateUsers(users: List<User>) 返回受影响行数

SQLite 实现
需构造 ContentValues 并指定更新条件。

ContentValues values = new ContentValues();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"张三"});

删(Delete)

Room 实现
通过 @Delete 注解删除数据,支持单个或批量删除。

操作类型 代码示例 说明
单条删除 @Delete suspend fun deleteUser(user: User) 根据主键删除
批量删除 @Delete suspend fun deleteUsers(users: List<User>) 返回受影响行数

SQLite 实现
直接执行 DELETE SQL 语句。

db.delete("user", "age < ?", new String[]{"20"}); // 删除年龄小于20的记录

关键注意事项

  1. 线程管理

    • Room 的挂起函数(suspend)需在协程中调用。
    • SQLite 操作需在子线程执行,避免阻塞主线程。
  2. 版本迁移

    • 使用 migration 处理数据库版本升级(Room)。
    • SQLite 需手动处理 onUpgrade 逻辑。
  3. 数据安全

    • 避免直接拼接 SQL,使用参数绑定防止注入攻击。
    • Room 默认支持编译时校验 SQL 正确性。

相关问题与解答

问题1:Room 如何实现多表关联查询?

解答
通过 @Transaction@Query 组合实现。

@Transaction
@Query("SELECT  FROM user WHERE id IN (SELECT user_id FROM order_table)")
fun getUsersWithOrders(): LiveData<List<User>>

需确保事务内所有操作成功,否则会回滚。


问题2:SQLite 如何优化大数据量查询?

解答

  1. 为常用查询字段添加索引(CREATE INDEX)。
  2. 分页加载数据(LIMIT + OFFSET)。
  3. 避免使用 SELECT ,仅查询必要字段
0