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.mzph.cn/news/3155.shtml

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

相关文章

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

laravel门面实现原理之源码分析

文章目录 场景总结源码分析 场景 最近待业&#xff0c;重新翻看laravel源码, Route::get注册路由&#xff0c;那Route类并没有get方法&#xff0c;那这行代码究竟执行了什么呢? 总结 Route::get 会调到父类的魔术方法__callStatic 第一步: getFacadeRoot 从容器中获取名称是ro…

了解 3DS MAX 3D摄像机跟踪设置:第 7 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 在SynthEyes中跟踪素材 步骤 1 打开SynthEyes软件。 打开合成之眼 步骤 2 在跟踪素材之前&#xff0c;您需要设置首选项。因为&#xff0c;你 稍后将在 3ds Max 中工作&#xff0c;必须根据 3ds Max…

【源码解析】Mybatis执行原理

Mybatis执行原理 1.获取SqlSessionFactory2.创建SqlSession3.创建Mapper、执行SQL MyBatis 是一款优秀的持久层框架&#xff0c;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和…

elasticsearch学习入门+实战

学习链接1 基础概念 官网学习&#xff1a;地址 基本命令 PS&#xff1a;使用Apifox测试 查询所有索引库 添加索引库 添加时&#xff0c;加入分词器 添加时&#xff0c;加入记录属性值 查询获取索引库 删除索引库 添加文档 必须要在添加文档值的时候用【_doc】&a…

如何在 Excel 中快速生成随机密码?

有时&#xff0c;我们可能想创建随机密码来保护某些重要内容。 但是&#xff0c;您有什么技巧可以在Excel中快速生成随机密码&#xff1f; 在这里&#xff0c;我有一些可以在Excel工作表中处理的方法。 用公式生成随机密码 使用插入随机数据生成随机密码​编辑 用公式生成随机…

「深度学习之优化算法」(十五)混合蛙跳算法

1. 混合蛙跳算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   混合蛙跳算法(Shuffled Frog Leaping Algorithm)是根据青蛙在石块上觅食时的种群分布变化而提出的算法。算法提出于2003年,时间有点久远,但相关的论文并不是特别多,仍有较大的研究和改进空间。…

IPD跟敏捷、DevOps一样吗?有什么区别?

1992年在激烈的全球市场竞争下&#xff0c;IBM遭遇到了严重的财政困难&#xff0c;公司销售收入停止增长&#xff0c;利润急剧下降。经过内部分析&#xff0c;IBM发现他们在研发费用、研发损失费用和产品上市时间等几个方面远远落后于业界最佳。为了重新获得市场竞争优势&#…

思维决定发展,测试人也不例外

最近特别懒&#xff0c;不想码字&#xff0c;原本写作就很差&#xff0c;更是退化严重。社招和校招面试过很多人&#xff0c;从十年前自己还很弱的时候学着面试&#xff0c;到数百次面试积累之后&#xff0c;面对候选人的时候&#xff0c;我的内心依然有些许紧张&#xff0c;非…

初识protobuf

Protobuf 全称Protocol Buffers&#xff08;协议缓冲区&#xff09;&#xff0c;是一种轻量级、高效的数据序列化格式&#xff0c;由Google开发。它被设计用于结构化数据的序列化、反序列化以及数据交换&#xff0c;常用于网络通信和数据存储等领域。 Protobuf使用简洁的消息描…

高效又安全的企业大数据传输解决方案推荐

在当前的商业领域中&#xff0c;企业大数据传输是一个重要而复杂的问题。随着企业规模和数据量的扩大&#xff0c;如何安全可靠、高效快速地传输大数据成为了许多企业需要面对的挑战。本文将介绍几种值得考虑的企业大数据传输解决方案&#xff0c;以帮助企业有效应对这一挑战。…

react refresh 的用法

React Refresh 是一个用于在开发过程中实现快速热重载的工具。它允许在不刷新整个页面的情况下更新 React 组件&#xff0c;从而提供更快的开发体验。 要使用 React Refresh&#xff0c;首先需要确保项目中安装了 React 17 或更高版本。然后&#xff0c;可以按照以下步骤来配置…

【产品设计】微信小程序如何做好“授权”设计?

授权登录降低了用户注册账号时的操作成本&#xff0c;减少了产品的获客门槛。在本文中&#xff0c;作者结合案例&#xff0c;盘点了微信小程序授权登录设计中需要注意的几点问题&#xff0c;并对功能设计背后的设计思路与原理进行了简要的分析 01 openID 这是微信生态圈中&…

ROS:动态参数

目录 一、前言二、概念三、作用四、实际用例4.1需求4.2客户端4.2.1流程4.2.2新建功能包4.2.3添加.cfg文件4.2.4配置 CMakeLists.txt4.2.5编译 4.3服务端(C)4.3.1流程4.3.2vscode配置4.3.3服务器代码实现4.3.4编译配置文件4.3.5执行 4.4服务端(Python)4.4.1流程4.4.2vscode配置4…

canvas获取视频封面及个别电脑获取到空图

读取视频封面&#xff1a; let video document.createElement("video");video.src videosrc;video.currentTime 10 // 可能出现黑屏&#xff0c;从10帧video.muted true; // 解决个别电脑获取到空图video.autoplay true; // 解决个别电脑获取到空图video.preload…

EasyCVR视频融合平台能正常播放其他协议流,但无法播放HLS流的原因排查

EasyCVR基于云边端一体化架构&#xff0c;支持海量视频汇聚管理&#xff0c;平台支持多协议与多类型设备接入&#xff0c;具体包括国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等。…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它的官方客户端提供了多种编程语言的接口&#xff0c;包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

【Leetcode】687.最长同值路径

一、题目 1、题目描述 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例1: 输入:root = [5,4,5,1,1,5] 输出:2示例2: 输入:root …

PMP考题练习2023-07-19

1、敏捷管理专业人士注意到产品待办事项上一个新故事很模糊&#xff0c;缺少验收标准。敏捷管理专业人士应在sprint周期中的哪个时间点要求产品负责人提供更多详情&#xff1f; A.在待办事项梳理会上。 B.在sprint回顾会议上。 C.在每日scrum期问。 D.在选代评审会上。 选A 解释…

C++入门(未完待续)

1.命名空间 使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染 定义命名空间&#xff0c;需要使用到namespace关键字&#xff0c;后面跟命名空间的名字&#xff0c;然后接一对{}即可&#xff0c;{}中即为命名空间的成员 ①.普通的命名空间 n…