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

news2024/11/20 7:19:15

目录

1.导入依赖库

2.数据实体类

3.数据访问对象 (DAO)

4.数据库类

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

6.数据库升降级处理

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

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

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


1.导入依赖库

kapt "androidx.room:room-compiler:2.2.5"
api("androidx.room:room-ktx:2.2.5"

2.数据实体类

@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)

@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.数据库类

@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里面的“增、删、改、查”方法

//获取所有国家列表
FlowFitDatabase.getInstance(CONTEXT).areaDao().getCountryList(language)

6.数据库升降级处理

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

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

1.修改version版本号

2.添加升级适配代码

升级(不保存数据库历史数据):
.fallbackToDestructiveMigration() //升级,清空数据库
降级(不保存数据库历史数据):
.fallbackToDestructiveMigrationOnDowngrade()//降级的时候,当未匹配到版本的时候就会直接删除表然后重新创建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指 offer 数学算法题:数值的整数次方

题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff1a; 直接计算法&#xff0c;通过判断 n 的正负&#xff0c;若为负数&#xff0c; x 即…

无法加载文件\venv\Scripts\Activate.ps1,因为在此系统上禁止运行脚本

一、问题发生 运行环境Windows 10、python 3.11.1、IDE VScode 当然你可能使用了其他IDE&#xff0c;例如pycharm等&#xff0c;不过没有关系解决问题的方法都是一致的。 报错信息如下图所示&#xff1a; actvivate.ps1这个脚本文件是用来激活python虚拟环境的。 其实&…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜&#xff08;SEM&#xff09;是一种功能强大的工具&#xff0c;广泛用于高分辨率的生物和半导体样品检测。然而&#xff0c;对于大面积或3D成像&#xff0c;SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…

spring5源码篇(10)——spring-aop代理过程

spring-framework 版本&#xff1a;v5.3.19 文章目录 1、ProxyFactory1.1、createAopProxy() 创建AopProxy1.2、getProxy() 创建代理对象1.3、JdkDynamicAopProxy#invoke 代理逻辑1.3.1、advised.getInterceptorsAndDynamicInterceptionAdvice() 匹配添加的advisor并转化成所需…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff…

通识强化学习,初步了解强化学习的运行规则和估值方法

1.强化学习的发展及应用现状 1.1.强化学习的由来 目前&#xff0c;大家认为强化学习&#xff08;Reinforcement Learning, RL&#xff09;的来源与两个领域密切相关&#xff1a;即心理学的动物试错学习和最优控制的优化理论。 这里都是有相应的共性的&#xff0c;在environme…

PostgreSQL MVCC的弊端优化方案

我们之前的博客文章“我们最讨厌的 PostgreSQL 部分”讨论了大家最喜欢的 DBMS 多版本并发控制 (MVCC) 实现所带来的问题。其中包括版本复制、表膨胀、索引维护和真空管理。本文将探讨针对每个问题优化 PostgreSQL 的方法。 尽管 PostgreSQL 的 MVCC 实现是 Oracle 和 MySQL 等…

java每日一题:HashMap的工作原理

面试官&#xff1a;欢迎参加我们的面试。请你解释一下Java中HashMap的工作原理。&#x1f60a; 面试者&#xff1a;HashMap是一种基于哈希表的数据结构&#xff0c;它可以存储键值对。在HashMap内部&#xff0c;使用一个数组来存储数据&#xff0c;数组中的每个位置被称为桶&a…

生信分析案例 Python简明教程 | 视频11

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

C语言之每日一题——杨氏矩阵

今天分享的是杨氏矩阵&#xff0c;题目不是特别难&#xff0c;但是是一道比较考验你对杨氏矩阵的理解&#xff0c;要是你不知道杨氏矩阵的话&#xff0c;那你这道题目就无从下手 杨氏矩阵我们可以这样理解&#xff0c;首先矩阵二字证明他是一个长方形型或者正方形的数组&#x…

【HarmonyOS】元服务隐私协议开发指导样例

【关键字】 隐私、弹窗、元服务、协议 【介绍】 每个元服务必须提供隐私声明&#xff0c;否则将导致提交元服务发布上架时&#xff0c;审核无法通过。隐私声明的具体要求请参见隐私声明规范。用户使用元服务前&#xff0c;必须引导其了解隐私声明信息&#xff0c;获取用户授权…

3.SpringBoot 返回Html界面

1.添加依赖spring-boot-starter-web <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2.创建Html界面 在Resources/static 文件夹下面建立对应的html&#xff0c…

【亮点回顾】第四届国有企业数智化采购与智慧供应链论坛

7月12日&#xff0c;由中国物流与采购联合会主办、北京筑龙承办的“第四届国有企业数智化采购与智慧供应链论坛”在北京市盛大举行。本届论坛以“数智赋能创新发展”为主题&#xff0c;立足于国有企业采购领域发展前沿&#xff0c;深度聚焦国有企业如何在数字经济发展中发挥引领…

【uView 1.x】中国省市县/区 地区选择器picker【亲测可用】

如果你还没安装uView&#xff0c;请先安装uView 注意&#xff1a;这是uView1.x Picker选择器的用法&#xff0c;uView2.x Picker选择器中没有mode属性 效果图&#xff1a; 把u-picker的mode设置为region地区模式&#xff0c;然后展示在u-input中。 由于uview中自带城市数据包…

echart折线图背景颜色自定义,实心圆点,虚线网格等功能

需求&#xff1a;根据传入的值对背景进行分层颜色展示&#xff0c;比如y轴20-40区间颜色为蓝色&#xff0c;40-50为红色这种&#xff0c;折线图的小圆点设置为实现&#xff0c;实现缩放功能 1.效果如下 2.代码讲解如下 首先下载echarts npm install echarts4.9.0 -S 我这边…

LeetCode·每日一题·931. 下降路径最小和·记忆化搜索

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/minimum-falling-path-sum/solutions/2341965/ji-yi-hua-sou-suo-zhu-shi-chao-ji-xiang-3n58v/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&am…

Mysql单表多表查询练习

题目要求&#xff1a; 1.查询student表的所有记录 2.查询student表的第2到4条记录 3.从student表查询所有的学生的学号&#xff08;id&#xff09;&#xff0c;姓名&#xff08;name&#xff09;&#xff0c;和院系&#xff08;department&#xff09;的信息 4.从student表…

LeetCode 75 第一题(1768)交替合并字符串

题目: 示例: 分析: 这是LeetCode75 的第一道题目,是一道简单题,题目没那么复杂,就是给两个字符串,要这两个字符串你出一个字符我出一个字符来拼凑出一个新的字符串,如果其中一个字符串用完了则剩下部分全部由另一个字符串出. 我们可以使用两个指针分别指向word1和word2: str…

【hadoop】部署hadoop全分布模式

hadoop全分布模式 全分布模式特点部署全分布模式准备工作正式配置hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xmlslaves对NameNode进行格式化复制到另外两台虚拟机启动 对部署是否成功进行测试 全分布模式特点 真正的分布式环境&#xff0c;用于生产具…

【动手学习深度学习--逐行代码解析合集】19含并行连结的网络(GoogleNet)

【动手学习深度学习】逐行代码解析合集 19含并行连结的网络&#xff08;GoogleNet&#xff09; 视频链接&#xff1a;动手学习深度学习–含并行连结的网络&#xff08;GoogleNet&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v…