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()//降级的时候,当未匹配到版本的时候就会直接删除表然后重新创建
相关推荐
PGCCC22 分钟前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China2 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策4 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝5 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~5 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员5 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
睿思达DBA_WGX6 小时前
Oracle 11g rac 集群节点的修复过程
数据库·oracle
尘浮生6 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
Leo.yuan7 小时前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi