【JetPack】Room数据库笔记
Room数据库笔记
ORM框架:对齐数据库数据结构与面向对象数据结构之间的关系,使开发编程只考虑面向对象不需要考虑数据库的结构
Entity : 数据实体,对应数据库中的表 <完成面向对象与数据库表结构的映射>
注解:
类添加注解,并指定与数据库中表的对应关系
@Entity(tableName = "Book")
主键自增
@PrimaryKey(autoGenerate = true)
private int _id;
数据库字段名称,字段类型 对应对象的属性
@ColumnInfo(name = "card_name",typeAffinity = ColumnInfo.TEXT)
private String cardName;
数据库忽略这种构造方法,不需要数据库考虑的方法都使用Ignore注解
@Ignore
public CardInfoAuditionEntity(String className, int mode) {this.className = className;this.mode = mode;
}
DAO:数据访问对象,包含访问数据库的方法 <完成数据库增删改查语句的映射>
@Query注解下的返回值可以是一个LiveData类型,在Activity或者Fragment中监听这个LiveData值的变化,执行刷新UI的操作
是一个接口类,并且用Dao注解声明
@Dao
// 数据库查询语句与Java中查询方法相对应
(查询语句返回值为LiveData类型,Room数据库会在数据库的本条查询结果发生变更时触发setValue,在Acticity或者Fragment中注册对返回结果值的监听,完成界面刷新)
@Query("SELECT * FROM CardInfoAuditionEntity")
LiveData<List<CardInfoAuditionEntity>> queryCardInfoAuditionLiveData();
// 数据库筛选查询,useId与Java语句中的参数名要保持一致
@Query("SELECT * FROM users WHERE id = :userId")
User getUserById(int userId);
// Query注解可以使用其他的SQL语句进行查询
@Query("SELECT COUNT(*) FROM users")
int getUserCount();
// Query注解可以使用时执行Delete语句等
@Query("DELETE FROM users")
void deleteAllUsers();
// Delete注解:该注解标记的方法用于从数据库中删除用户信息。
deleteUser(User user):删除用户信息,返回删除的行数。
@Delete
int deleteUser(User user);
// Update 注解:该注解标记的方法用于更新数据库中的用户信息。
updateUser(User user):更新用户信息,返回更新的行数
// 插入多条数据,插入时插入的数据与已有的数据冲突,替换
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(CardInfoAuditionEntity... cardInfoAuditionEntity);
// Transaction注解等于数据库事务,多条数据库SQL指令一起执行,全部成功则插入数据库,存在失败会回滚
@Transaction
default void insertAll(List<CardInfoAuditionEntity> entities) {for (CardInfoAuditionEntity entity : entities) {insert(entity);}
}
Database:数据库持有者
DataBase类是一个继承RoomDatabase的抽象类,用注解Database声明
@Database(entities = {CardInfoPromotionEntity.class, CardInfoAuditionEntity.class, AppInfoEntity.class, FirstCreateStateEntity.class}, exportSchema = false, version = 1)
public abstract class LauncherDatabase extends RoomDatabase {
}
创建数据库
db = Room.databaseBuilder(context.getApplicationContext(),LauncherDatabase.class, APP_INFO_DATABASE).addCallback(dbCallback).build();
引入Dao对象
public abstract CardInfoPromotionDao cardInfoPromotionDao();
在调用Dao文件中方法时尽量不在主线程(也可以在主线程,在创建数据库时传入一个参数),可以使用AnsyTask,总之要在子线程,或者创建一个ExecutorService
数据库升级
创建 Migration 类:对于每一次数据库版本的升级,需要创建一个 Migration 类,该类实现 Migration 接口;
在构建 RoomDatabase 实例时,将 Migration 实例添加到 RoomDatabase.Builder 的 addMigrations 方法中;
在Database注解中声明当前数据库版本
@Database(entities = {User.class}, version = 2)
.addMigrations(MIGRATION_1_2)
// 从版本 1 升级到版本 2 的 Migration
static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(SupportSQLiteDatabase database) {// 这里执行从版本 1 到版本 2 的数据库变更操作database.execSQL("ALTER TABLE User ADD COLUMN age INTEGER NOT NULL DEFAULT 0");}
};
数据库升级异常捕获
使用 FallbackToDestructiveMigration,升级版本号不合规或升级失败后,数据库中数据被清空,但不会引发系统崩溃
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, "app_database").fallbackToDestructiveMigration().build();
数据库表结构修改,使用数据迁移
1.先创建备用表(期待修改后的表结构)
2.之后将原有表中所有数据插入到备用表中
3.删除原有表
4.修改备用表的表名为原有表
Room数据库schema文件
记录每次数据库升级后表的结构
1.先设置exportSchema为true
@Database(entities = {CardInfoPromotionEntity.class, CardInfoAuditionEntity.class, AppInfoEntity.class, FirstCreateStateEntity.class}, exportSchema = true, version = 1)
在build.gradle中配置文件生成位置
android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]}}}
}
加载数据库初始数据
在构建数据库过程中,使用 createFromAsset 方法指定从 assets 文件夹中的预填充数据库文件创建数据库
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, "app_database").createFromAsset("prepopulated.db").build();
相关文章:

【JetPack】Room数据库笔记
Room数据库笔记 ORM框架:对齐数据库数据结构与面向对象数据结构之间的关系,使开发编程只考虑面向对象不需要考虑数据库的结构 Entity : 数据实体,对应数据库中的表 <完成面向对象与数据库表结构的映射> 注解: 类添加注解…...

【CSS in Depth 2 精译_088】第五部分:添加动效概述 + 第 15 章:CSS 过渡特效概述 + 15.1:状态间的由此及彼
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼 ✔️15.2 定时函数 文章目录 第 5 部分 添加动效 Adding motion第 15 章 过渡 Transitions15.1 状态间的由此及彼 From here…...

# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
↑ 上方下载文档 (大小374KB) 接口文档预览 (超过50个接口) 一、数据库25张表er-关系清晰构图!(tip: 鼠标右键图片 > 放大图像) 二、难点/经验 详细说明 热门评论排序评论点赞列表|DTO封装经验分享|精华接口文档说明 组员都说喜欢分档对应枚举码 如果这篇文章…...

[机器学习]XGBoost(3)——确定树的结构
XGBoost的目标函数详见[机器学习]XGBoost(2)——目标函数(公式详解) 确定树的结构 之前在关于目标函数的计算中,均假设树的结构是确定的,但实际上,当划分条件不同时,叶子节点包含的…...

PHP阶段一
PHP 一门编程语言 运行在服务器端 专门用户开发网站的 脚本后缀名.php 与HTML语言进行混编,脚本后缀依然是.php 解释型语言,不要编译直接运行 PHP运行需要环境: Windows phpstudy Linux 单独安装 Web 原理简述 1、打开浏览器 2、输入u…...

用人话讲计算机:Python篇!(十五)迭代器、生成器、装饰器
一、迭代器 (1)定义 标准解释:迭代器是 Python 中实现了迭代协议的对象,即提供__iter__()和 __next__()方法,任何实现了这两个方法的对象都可以被称为迭代器。 所谓__iter__(),即返回迭代器自身 所谓__…...

5G -- 5G网络架构
5G组网场景 从4G到5G的网络演进: 1、UE -> 4G基站 -> 4G核心网 * 部署初中期,利用存量网络,引入5G基站,4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期,引入5G核心网&am…...

VR线上展厅的色彩管理如何影响用户情绪?
VR线上展厅的色彩管理对用户情绪的影响是多方面的,以下是专业从事VR线上展厅制作的圆桌3D云展厅平台为大家介绍的一些关键点: 情感共鸣:色彩能够激发特定的情感反应。例如,暖色调(如红色、橙色)通常与活力和…...

Vue3:uv-upload图片上传
效果图: 参考文档: Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码: <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…...

大数据机器学习算法和计算机视觉应用07:机器学习
Machine Learning Goal of Machine LearningLinear ClassificationSolutionNumerical output example: linear regressionStochastic Gradient DescentMatrix Acceleration Goal of Machine Learning 机器学习的目标 假设现在有一组数据 x i , y i {x_i,y_i} xi,yi&…...

基于asp.net游乐园管理系统设计与实现
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…...

一区牛顿-拉夫逊算法+分解+深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测
一区牛顿-拉夫逊算法分解深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测 目录 一区牛顿-拉夫逊算法分解深度学习!VMD-NRBO-Transformer-GRU多变量时间序列光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院一区…...

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决
要在创建的key上添加配额 点击配额之后进入分配页面,分配完之后刷新uniapp就可以调用成功了。...

WPF 完美解决改变指示灯的颜色
WPF 完美解决改变指示灯的颜色 原有:自己再做WPF页面设计后发现直接去查找页面多个控件嵌套情况下找不到指示灯(Button实现的,详细可以看这篇文章 这里),具体看看来如何实现 加粗样式思路:无论多级嵌套&a…...

Flutter/Dart:使用日志模块Logger Easier
Flutter笔记 Flutter/Dart:使用日志模块Logger Easier Logger Easier 是一个为 Dart 和 Flutter 应用程序量身定制的现代化日志管理解决方案。它提供了一个高度灵活、功能丰富的日志记录系统,旨在简化开发者的日志管理工作,同时提供一定的定制…...

阿里云云服务器初始化
如果我们的云服务器出现无法挽回的错误时,我们可以尝试初始化云服务器进行解决。 首先搜索阿里云(你要先确认自己已经购买了阿里云的云服务器): 登录账号后主页向下划 进入后点击管理控制台 点击进入后可以看到正在运行࿰…...

Python中SKlearn的K-means使用详解
文章目录 Python中SKlearn的K-means使用详解一、引言二、K-means算法原理三、使用SKlearn进行K-means聚类的步骤1、导入必要的库2、生成数据集3、创建K-means模型并设置参数4、训练模型5、预测簇标签6、可视化结果 四、总结 Python中SKlearn的K-means使用详解 一、引言 K-mea…...

红帽RHCE认证适用哪些人学习
红帽 RHCE工程师认证有着广泛的适用人群。对于初入 IT 行业的新手来说,RHCE 是快速建立专业基础、提升自身竞争力的绝佳途径。它能帮助新人系统地学习 Linux 系统知识,从基础的安装配置到复杂的网络服务管理,一步一个脚印地构建起坚实的技术框…...

FFmpeg 框架简介和文件解复用
文章目录 ffmpeg框架简介libavformat库libavcodec库libavdevice库 复用(muxers)和解复用(demuxers)容器格式FLVScript Tag Data结构(脚本类型、帧类型)Audio Tag Data结构(音频Tag)V…...

《Java核心技术I》Swing中的边框
边框 BorderFactory静态方法创建边框,凹斜面,凸斜面,蚀刻,直线,蒙版,空白。 边框添加标题,BorderFactory.createTitledBorder 组合边框,BorderFactory.createCompoundBorder JCo…...

MySQL 中的常见错误与排查
在 MySQL 数据库的日常运维中,管理员可能会遇到各种错误。无论是查询性能问题、连接异常、数据一致性问题,还是磁盘空间不足等,及时排查并解决这些问题是保证数据库稳定运行的关键。本文将列出 MySQL 中一些常见的错误及其排查方法。 一、连接…...

SQL 查询方式比较:子查询与自连接
在 SQL 中,子查询和自连接是两种常见的查询方式,它们的功能虽然可以相同,但实现的方式不同。本文通过具体示例,深入探讨这两种查询方式,并配合数据展示,帮助大家理解它们的使用场景和差异。 数据示例 假设…...

Linux下学【MySQL】所有常用类型详解( 配实操图 通俗易懂 )
每日激励:“当你觉得你会幸运时,幸运就会眷顾你,所以努力吧,只要你把事情做好,并觉得你会幸运,你将会变得幸运且充实。” 绪论: 本章继续学习MySQL的知识,本章主要讲到mysql中的所…...

Gin-vue-admin(1):环境配置和安装
目录 环境配置如果443网络连接问题,需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令,用于维护 go.mod 文件…...

如何在centos系统上挂载U盘
在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…...

2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测
前言 随着人工智能技术的快速发展,大语言模型(LLM)已经成为了技术领域最热门的话题。本文将详细对比目前主流的大语言模型,帮助大家选择最适合的工具。 一、OpenAI GPT系列 1. GPT-4 核心优势: 多模态理解能力强 逻辑推理能力出色 创造…...

openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
symbols-unix 文件部分内容 JVM_IHashCode JVM_InitClassName JVM_InitStackTraceElement JVM_InitStackTraceElementArray JVM_InitializeFromArchive JVM_InternString 要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因,我们需要从构建过程、符号…...

day16 python(4)——UnitTest
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、UnitTest框架介绍 1.1 UnitTest框架 1.2 unitTest的组成(5部分) 1.2.1 TestCase(测试用例) 1.2.2 TestSuit 和 TestRunner 【方法1】 【方法2】 1…...

Kafka快速扫描
Architecture 系统间解耦,异步通信,削峰填谷 Topic 消息主题,用于存储消息 Partition 分区,通过扩大分区,可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道:…...

python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块
问题:python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块 解决方法 pip uninstall scipy pip install scipy总结:卸载出问题的库并重新安装,再次通过pyinstaller -F -w xxx.py 打包…...