上一篇
安卓开发数据库增删改查
- 行业动态
- 2025-04-22
- 2
数据库选择与准备
安卓开发中常用的本地数据库方案包括 SQLite 和 Room(基于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 并解析结果。
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的记录
关键注意事项
线程管理
- Room 的挂起函数(suspend)需在协程中调用。
- SQLite 操作需在子线程执行,避免阻塞主线程。
版本迁移
- 使用
migration
处理数据库版本升级(Room)。 - SQLite 需手动处理
onUpgrade
逻辑。
- 使用
数据安全
- 避免直接拼接 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 如何优化大数据量查询?
解答:
- 为常用查询字段添加索引(
CREATE INDEX
)。 - 分页加载数据(
LIMIT
+OFFSET
)。 - 避免使用
SELECT
,仅查询必要字段