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

安卓开发数据库如何使用

安卓开发中数据库的使用详解

SQLite 与 Room 的选择

安卓开发中常用的数据库方案包括 SQLite(原生支持)和 Room(谷歌推荐的新型数据库层),以下是两者的核心区别:

特性 SQLite Room
开发复杂度 需手动编写 SQL 语句,易出错 提供抽象层,基于注解生成代码
编译时检查 支持(通过注解校验 SQL 正确性)
架构组件集成 天然支持 LiveData、Coroutines、Flow
最佳适用场景 简单需求、快速原型 复杂业务逻辑、需要架构组件联动的场景

Room 数据库使用步骤

  1. 添加依赖
    build.gradle 中添加:

    dependencies {
        implementation "androidx.room:room-runtime:2.5.1"
        kapt "androidx.room:room-compiler:2.5.1" // 如果使用 Kotlin
    }
  2. 定义实体类
    @Entity 标注类,字段用 @ColumnInfo 指定列名:

    @Entity(tableName = "user")
    data class User(
        @PrimaryKey(autoGenerate = true) val id: Int,
        @ColumnInfo(name = "name") val name: String,
        @ColumnInfo(name = "age") val age: Int
    )
  3. 创建 DAO(数据访问对象)
    定义接口并用 @Dao 标注,方法用 @Insert/@Update/@Delete/@Query

    安卓开发数据库如何使用

    安卓开发数据库如何使用

    @Dao
    interface UserDao {
        @Insert suspend fun insertUser(user: User)
        @Query("SELECT  FROM user WHERE id = :id")
        suspend fun getUserById(id: Int): User?
        @Delete suspend fun deleteUser(user: User)
    }
  4. 创建数据库类
    @Database 标注,关联 DAO:

    @Database(entities = [User::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    }
  5. 实例化数据库
    在应用入口初始化:

    val db = Room.databaseBuilder(
        context, AppDatabase::class.java, "app-database"
    ).build()

数据库操作示例

  1. 插入数据

    val user = User(id = 0, name = "Alice", age = 25)
    db.userDao().insertUser(user)
  2. 查询数据(返回 LiveData)

    安卓开发数据库如何使用

    @Query("SELECT  FROM user")
    fun getAllUsers(): LiveData<List<User>>
  3. 异步操作(Coroutines)

    lifecycleScope.launch {
        val users = db.userDao().getAllUsers().first()
        // 处理数据
    }

常见问题与解决方案

问题 解决方案
数据库升级失败 实现 Migration 接口,定义版本迁移逻辑
多线程导致数据冲突 Room 默认支持多线程安全,无需额外处理(底层使用 ReentrantReadWriteLock
数据加密需求 结合 SQLite + SQLCipher,或使用第三方库(Room 暂不直接支持加密)

相关问题与解答

问题1:Room 相比直接使用 SQLite 有什么优势?

解答

  1. 编译时验证:Room 通过注解生成代码,可提前发现 SQL 错误;
  2. 减少样板代码:自动生成 DAO 实现类,避免手写 ContentValuesSQLiteStatement
  3. 架构组件集成:支持 LiveData 观察数据变化,简化 UI 更新逻辑;
  4. 类型安全:避免因字符串拼接导致的 SQL 注入风险。

问题2:如何处理数据库版本升级?

解答

  1. 定义 Migration:在 Room.databaseBuilder 中添加迁移策略:
    val MIGRATION_1_2 = object : Migration(1, 2) {
        override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("ALTER TABLE user ADD COLUMN last_login INTEGER")
        }
    }
  2. 调用迁移
    Room.databaseBuilder(context, AppDatabase::class.java, "db-name")
        .addMigrations(MIGRATION_1_2)
        .build()
  3. 数据迁移逻辑:若无法自动迁移,需手动处理数据复制或清理