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()//降级的时候,当未匹配到版本的时候就会直接删除表然后重新创建
相关推荐
科技小花6 分钟前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56611 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717213 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本3 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi3 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai4 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw04 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209254 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
ACP广源盛139246256734 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑