Android Room 数据库之简单上手

本篇介绍Room的简单使用,不涉及数据库升级;内容包括gradle配置、依赖、数据库增删改。

一、App Gradle配置

gradle配置主要是添加room依赖

gradle.kts 复制代码
plugins {
    //org.jetbrains.kotlin.android:1.9.0
    alias(libs.plugins.kotlin.android)
    //com.google.devtools.ksp:1.9.0-1.0.13
    alias(libs.plugins.kotlin.ksp)
}

dependencies {
    val room_version = "2.6.1"
    implementation("androidx.room:room-runtime:$room_version")
    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See Add the KSP plugin to your project
    ksp("androidx.room:room-compiler:$room_version")
    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor("androidx.room:room-compiler:$room_version")
    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")
}

二、创建数据库实体类

一个实体类对应一个数据表,在类上加上@Entiry表示

kotlin 复制代码
@Entity
data class Wong(
    val userName: String,
    val age: Int,
    // 在数据库中0表示false,1表示true
    val isGirl: Boolean = false
) {
    //必须要指定 PrimaryKey
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0
}

三、创建数据库Dao

创建增删改查工具接口类,类上加@Dao表示,在每个增删改查方法上加上对应的注解:@Insert、@Delete、@Update、Query。 注意Dao是个接口。

kotlin 复制代码
@Dao
interface WongDao {
    @Insert
    fun insert(wong: Wong)

    @Insert
    fun insert(vararg wong: Wong)

    @Insert
    fun insert(wong: List<Wong>)

    /**
     * 返回0表示删除失败
     * 只会拿id去匹配
     */
    @Delete
    fun delete(wong: Wong): Int

    @Update
    fun update(wong: Wong)

    @Query("SELECT * FROM wong")
    fun getAll(): List<Wong>
}

四、创建数据库Database

这个类用于创建Dao和数据库升级,是个抽象类,继承自RoomDatabase,每个表Dao对应一个抽象方法; 通过Room.databaseBuilder(context, AppDatabase::class.java, "my-db").build()方法获取当前数据库对象;

kotlin 复制代码
@Database(entities = [Wong::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    //每个表对应一个抽象方法
    abstract fun wongDao(): WongDao

    companion object {
        // [这里instance是官方demo的写法](https://github.com/android/sunflower)
        @Volatile
        private var instance: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return instance ?: synchronized(this) {
                instance ?: buildDatabase(context).also { instance = it }
            }
        }

        private fun buildDatabase(context: Context): AppDatabase {
            return Room.databaseBuilder(context, AppDatabase::class.java, "my-db")
                .build()
        }
    }
}
相关推荐
事圆则缓6 小时前
Kotlin 类型与空安全:从接口数据到页面状态
kotlin
定栓7 小时前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
小熊在忙fpga7 小时前
N32G430芯片的flash表示
前端·javascript·html
Data analyse4567 小时前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
todoitbo7 小时前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
会灭火的程序员7 小时前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB7 小时前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
Chloe.Zz7 小时前
一篇入门Agent
开发语言·前端·javascript
java1234_小锋7 小时前
【技术专题】HTML5 网页技术 - HTML5 表格标签
前端·html·html5
雪芽蓝域zzs7 小时前
JS 项目转 TS 项目(Vue3 + 若依这类后台项目)完整改造清单
前端·vue.js