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

目录

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(): AreaDaoabstract fun alarmClockDao(): AlarmClockDaoabstract fun deviceInfoDao(): DeviceInfoDaocompanion object {/*单例模式*/@Volatileprivate var instance: FlowFitDatabase? = nullfun 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.hqwc.cn/news/22899.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计网笔记--运输层(vital)

目录 1--运输层概述 2--端口号、复用与分用的概念 3--UDP和TCP的对比 4--TCP的流量控制 5--TCP的拥塞控制 6--TCP超时重传时间的选择 7--TCP可靠传输的实现 8--TCP的连接建立 9--TCP的连接释放 10--TCP报文段的首部格式 1--运输层概述 运输层的任务&#xff1a; 为运…

Yalmip工具箱使用教程(1)-入门学习

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;YALMIP 1.Yalmip工具箱的下载与安装 1.1下载 Yalmip的作者是Johan Lfberg&#xff0c;是由Matlab平台编程实现的一个免费开源数学优化工具箱&#xff0c;在官网上就可以下载。官方下载…

cmake 提前结束处理命令: return

有时候,我们有这样的需求,当处理到某个地方的时候,后面的我们都不想处理或者不需要处理的时候,就可以提前结束当前的处理逻辑,回到父级去处理.在C/C中,我们有break关键字跳出当前循环,continue关键字进入下一次循环,return关键字返回当前处理的函数. cmake也提供了break(),con…

场景图生成——RelTR训练自己的数据集

RelTR训练自己的数据集 省流量省时间版本框的标注关系的标注总的 前言Open Images V6的标注格式RelTR中使用的Open Images V6的数据标注格式具体步骤框的标注生成格式关系三元组的生成格式 结束语参考链接 省流量省时间版本 框的标注 共需要创建4个json标注文件 train.json, …

本地部署 Stable Diffusion XL Gradio Demo WebUI

StableDiffusion XL Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradio De…

洛谷:P5016 龙虎斗 ← NOIP2018 普及组T2

【题目来源】https://www.luogu.com.cn/problem/P5016【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏&#xff0c;游戏的棋盘是一条线段&#xff0c;线段上有 n 个兵营&#xff08;自左至右编号 1∼n&#xff09;&#xff0c;相邻编号的兵营之间相隔 1 厘米&#xff0c;…

Learning Spatial and Spatio-Temporal Pixel

Learning Deformable Kernels for Image and Video Denoising 作者&#xff1a; Xiangyu Xu 商汤科技SenseTime Research 论文思想&#xff1a;一是将传统的双边滤波算法与CNN结合起来&#xff0c;二是用变形卷积来做多帧对齐的问题&#xff0c;三还是在raw上进行处理的。 …

Zookeeper集群 + Kafka集群 + Filebeat + ELK

目录 一&#xff1a;Zookeeper 概述 1、Zookeeper 定义 2、Zookeeper 工作机制 3、Zookeeper 特点 4、 Zookeeper 数据结构 5、 Zookeeper 应用场景 6、 Zookeeper 选举机制 &#xff08;1&#xff09;第一次启动选举机制 &#xff08;2&#xff09;非第一次启动选举机制…

JMeter 如何模拟不同的网络速度

目录 前言&#xff1a; 限制输出带宽以模拟不同的网络速度 将这两行添加到user.properties文件中&#xff08;可以在JMeter安装的bin文件夹中找到此行&#xff09; 通过-J 命令行参数传递属性的值&#xff0c;如下所示&#xff1a; 前言&#xff1a; JMeter可以通过使用不同…

【mysql】—— 数据库的操作

序言&#xff1a; 在上篇文章我已经对数据库进行了详细的介绍&#xff0c;接下来我们就将上手学习操作的细节了。本篇文章便带领大家去学习有关库操作的基本知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;库的操作 1、 创建数据库 2、字符集和…

【深度学习笔记】训练 / 验证 / 测试集

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加&#xff0c;人口抚养比也在迅速攀升&#xff0c;越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针&#xff0c;作为机构养老…