kotlin中使用Room数据库(包含升降级崩溃处理)

目录

1.导入依赖库

2.数据实体类

3.数据访问对象 (DAO)

4.数据库类

5.调用DAO里面的"增、删、改、查"方法

6.数据库升降级处理

升级(保存数据库历史数据):

升级(不保存数据库历史数据):

降级(不保存数据库历史数据):


1.导入依赖库

Kotlin 复制代码
kapt "androidx.room:room-compiler:2.2.5"
api("androidx.room:room-ktx:2.2.5"

2.数据实体类

Kotlin 复制代码
@Entity(tableName = "areas", indices = [Index(value = ["id"], unique = true)])
data class Area(
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    /*国家*/
    val country: String? = "",
    /*省、州*/
    val state: String? = "",
    /*城市*/
    val city: String? = "",
    /*省、州代码*/
    val stateCode: String? = "",
    /*城市代码*/
    val cityCode: String? = "",
    /*国家代码*/
    val countryCode: String? = "",
    /*新增时间*/
    val addTime: Long? = 0L,
    /*更新时间*/
    val updateTime: Long? = 0L,
    /*新增时间字符串*/
    val addTimeStr: String? = "",
    /*更新时间字符串*/
    val updateTimeStr: String? = "",
    val isDelete: Int,
    /*语言*/
    val language: String
)

3.数据访问对象 (DAO)

Kotlin 复制代码
@Dao
interface AreaDao {
    /**
     * 获取所有国家列表(以国家ID分组)
     */
    @Query("SELECT * FROM areas WHERE language=:language GROUP BY countryCode")
    fun getCountryList(language: String): List<Area>

    /**
     * 获取所有州/省列表
     */
    @Query("SELECT * FROM areas WHERE countryCode=:countryCode AND language=:language GROUP BY stateCode")
    fun getStateList(countryCode: String, language: String): List<Area>

    /**
     * 获取所有城市列表
     */
    @Query("SELECT * FROM areas WHERE countryCode=:countryCode AND stateCode=:stateCode AND language=:language GROUP BY cityCode")
    fun getCityList(countryCode: String, stateCode: String, language: String): List<Area>

    /**
     * 获取所有城市列表
     */
    @Query("SELECT * FROM areas WHERE countryCode=:countryCode AND language=:language GROUP BY cityCode")
    fun getCityList(countryCode: String, language: String): List<Area>

    /**
     * 批量插入地区记录
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAreas(tunnels: List<Area>): List<Long>

    /**
     * 删除所有地区记录
     */
    @Query("DELETE FROM areas")
    fun deleteAllArea()
}

4.数据库类

Kotlin 复制代码
@Database(
    entities = [Area::class, AlarmClock::class, DeviceInfo::class],
    version = 4, exportSchema = false
)
abstract class FlowFitDatabase : RoomDatabase() {

    abstract fun areaDao(): AreaDao
    abstract fun alarmClockDao(): AlarmClockDao
    abstract fun deviceInfoDao(): DeviceInfoDao

    companion object {
        /*单例模式*/
        @Volatile
        private var instance: FlowFitDatabase? = null

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

        /*创建并填充数据库*/
        private fun buildDatabase(context: Context): FlowFitDatabase {
            return Room.databaseBuilder(
                context,
                FlowFitDatabase::class.java,
                FLOW_FIT_DATABASE_NAME
            )
                .addMigrations(object : Migration(1, 2) {
                    override fun migrate(database: SupportSQLiteDatabase) {
                        database.execSQL("drop table IF EXISTS  StepTimeSharing ")
                        database.execSQL(
                            "CREATE TABLE IF NOT EXISTS \"StepTimeSharing\" (   " +
                                    "   \"date\" INTEGER NOT NULL,   " +
                                    "   \"calories\" INTEGER NOT NULL,   " +
                                    "   \"distances\" INTEGER NOT NULL,   " +
                                    "   \"steps\" INTEGER NOT NULL,   " +
                                    "   PRIMARY KEY (\"date\") " +
                                    ");"
                        )
                    }
                })
                .addCallback(object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        GlobalScope.launch(Dispatchers.IO) {
                            val database: FlowFitDatabase = getInstance(context)
                            /*初始化闹钟提醒记录*/
                            database.alarmClockDao().insertAll(
                                listOf(
                                    AlarmClock(
                                        id = 0,
                                        time = 0L,
                                        repeat = 0,
                                        isOpen = 0,
                                        hour = 0,
                                        minute = 0,
                                        label = 0,
                                        isShow = 0
                                    )
                                )
                            )
                        }

                    }

                    override fun onOpen(db: SupportSQLiteDatabase) {
                        super.onOpen(db)
                    }
                })
                .fallbackToDestructiveMigrationOnDowngrade()//降级的时候,当未匹配到版本的时候就会直接删除表然后重新创建
//                .fallbackToDestructiveMigration() //升级,清空数据库
                .build()
        }
    }
}

5.调用DAO里面的"增、删、改、查"方法

Kotlin 复制代码
//获取所有国家列表
FlowFitDatabase.getInstance(CONTEXT).areaDao().getCountryList(language)

6.数据库升降级处理

处理代码已包含在步骤4中:

升级(保存数据库历史数据):

1.修改version版本号

2.添加升级适配代码

升级(不保存数据库历史数据):
Kotlin 复制代码
.fallbackToDestructiveMigration() //升级,清空数据库
降级(不保存数据库历史数据):
Kotlin 复制代码
.fallbackToDestructiveMigrationOnDowngrade()//降级的时候,当未匹配到版本的时候就会直接删除表然后重新创建
相关推荐
Crazy________7 分钟前
Redis03:持久化存储,大key分析,主从复制及哨兵模式
数据库·redis·容器
自由能燃气设备25 分钟前
燃气容积式热水器厂家选购指南:2026年商用热水设备采购避坑手册
大数据·数据库·数据仓库·人工智能
oradh41 分钟前
Oracle数据文件的大小和数量的限制总结
数据库·oracle·数据文件大小限制·数据文件数量限制
刘某的Cloud43 分钟前
Galera Cluster部署 mariadb 节点down机,log sequence number恢复
linux·运维·数据库·负载均衡·mariadb·集群·高可用
xiaohaiAIgeo44 分钟前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识
SelectDB1 小时前
Apache Doris 4.1 Spill to Disk:避免运行内存密集型查询发生 OOM
数据库
范什么特西2 小时前
redis题目面渣重点
数据库·redis·缓存
TDengine (老段)2 小时前
TDengine taosAdapter — 多协议网关详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Nturmoils2 小时前
SQL Server 迁移到 KingbaseES:一次复杂 BI 查询的性能实测
数据库
今天AI了吗3 小时前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql