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

安卓开发新建数据库

安卓新建数据库的核心步骤

在安卓开发中,新建数据库通常基于 Room 组件(推荐方式)或直接使用 SQLiteOpenHelper,以下以 Room 为例说明流程:

添加依赖

build.gradle 中添加 Room 相关依赖:

安卓开发新建数据库

// Room 核心库
implementation "androidx.room:room-runtime:2.5.1"
// 编译时生成代码
annotationProcessor "androidx.room:room-compiler:2.5.1"
// 可选:支持 LiveData 和 Coroutines
implementation "androidx.room:room-ktx:2.5.1"

定义实体类(Entity)

使用 @Entity 注解标记数据表,字段需指定 ColumnInfo

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

定义数据访问对象(DAO)

通过 @Dao 定义数据库操作接口:

安卓开发新建数据库

@Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertUser(user: UserEntity)
    @Query("SELECT  FROM user WHERE id = :userId")
    fun getUserById(userId: Int): LiveData<UserEntity>
    @Delete
    suspend fun deleteUser(user: UserEntity)
}

创建数据库实例

通过 Room.databaseBuilder 初始化数据库:

@Database(entities = [UserEntity::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null
        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                INSTANCE ?: Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build().also { INSTANCE = it }
            }
        }
    }
}

关键注解与返回类型对照表

注解/功能 用途说明 常用场景示例
@Entity 标记数据表,需指定 tableName 定义用户表、订单表等
@PrimaryKey 标记主键,可设置 autoGenerate 用户 ID、订单编号
@ColumnInfo 自定义列名、类型等属性 列名与字段名不一致时使用
@Insert 插入数据,onConflict 处理冲突策略 新增用户、保存缓存数据
@Update 更新数据,需指定实体类 修改用户信息、更新订单状态
@Delete 删除数据,支持单个或多个实体 删除用户、清理过期数据
@Query 自定义 SQL 查询,支持返回 LiveDataFlow 复杂查询、实时监听数据变化
suspend 标记挂起函数,需在协程中调用 数据库操作涉及 IO 时使用
LiveData 观察数据变化,自动通知 UI 更新 监听消息列表、用户状态

常见问题与解答

问题1:如何选择主键类型?

  • 自增主键autoGenerate = true):适用于无需业务控制的 ID,如用户表、日志表。
  • UUID 字符串:适合分布式系统或合并数据场景,需手动生成。
  • 复合主键:通过 @Embedded 组合多个字段,适用于唯一性约束复杂的表。

问题2:如何处理多表关联查询?

  • 一对一关系:通过 @ForeignKey 关联表,DAO 中编写 @Transaction 包裹多个查询。
  • 一对多/多对多:需定义关系实体类,使用 @Relation 注解,Room 会自动处理连接逻辑。
  • 复杂关联:建议拆分为多个简单查询,在业务层组合数据,避免过度依赖数据库