【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) {
    @Override
    public 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();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony-4.HDI 框架

HDI 框架 1.HDI介绍 HDI&#xff08;Hardware Device Interface&#xff0c;硬件设备接口&#xff09;是HDF驱动框架为开发者提供的硬件规范化描述性接口&#xff0c;位于基础系统服务层和设备驱动层之间&#xff0c;是连通驱动程序和系统服务进行数据流通的桥梁&#xff0c;是…

AI Agent与MEME:技术与文化融合驱动Web3创新

AI Agent如何引领Web3新时代&#xff1f; 随着Web3与区块链技术的迅速发展&#xff0c;AI Agent作为人工智能与区块链的交汇点&#xff0c;正在逐步成为推动去中心化生态的重要力量。同时&#xff0c;MEME文化凭借其强大的社区驱动力和文化渗透力&#xff0c;在链上生态中扮演着…

接口测试-Fidder及jmeter使用

一、接口测试的基础 1.接口的含义 也叫做API&#xff0c;是一组定义、程序及协议的集合&#xff0c;提供访问一组例程的能力&#xff0c;无需访问源码获理解内部工作细节 2.接口的分类 代码内部的接口&#xff0c;程序模块间的接口&#xff0c;对于程序接口测试&#xff0c;需…

【数据集】医学常见9种皮肤疾病检测数据集11294张YOLO+VOC格式(已增强)

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;11294 Annotations文件夹中xml文件总计&#xff1a;11294 labels文件夹中txt文件总计&#xff1a;11294 标签种类数…

JavaSE——绘图入门

一、Java绘图坐标体系 下图说明了Java坐标系&#xff0c;坐标原地位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点x个像素&#xff1b;第二个是y坐标&#xff0c;表示当前位置为垂直…

探索 Seaborn Palette 的奥秘:为数据可视化增色添彩

一、引言 在数据科学的世界里&#xff0c;视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息&#xff0c;还能引发共鸣。Seaborn 是 Python 中一款广受欢迎的可视化库&#xff0c;而它的调色板&#xff08;palette&#xff09;功能&#xff0c;则为我们提供了调配绚…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

数据分析实战—玻璃类别分类

1.实战内容 (1) 加载玻璃类别数据集&#xff0c;划分训练集、测试集 import pandas as pd import numpy as np pd.set_option(display.max_columns, None) pd.set_option(display.max_rows, None) # 读取数据集 glass pd.read_csv(glass.csv, encodinggbk, headerNone) glas…

Hive是什么,Hive介绍

官方网站&#xff1a;Apache Hive Hive是一个基于Hadoop的数据仓库工具&#xff0c;主要用于处理和查询存储在HDSF上的大规模数据‌。Hive通过将结构化的数据文件映射为数据库表&#xff0c;并提供类SQL的查询功能&#xff0c;使得用户可以使用SQL语句来执行复杂的​MapReduce任…

GIN

gin是什么 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。如果你需要极好的性能&#xff0c;使用 Gin 吧。 特点&#xff1a;gin是golang的net/http库封装的web框架&#xff0c;api友好&#xff0c;注…

初始Python篇(13)—— 模块以及Python中常用的内置模块

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 模块的概念 模块的导入 包的概念以及使用 主程序运行 Python中常用的内置模块 random模块 time模块 datetime模块 …

时间序列异常值检测方法

文章目录 一、基于统计的方法1.1、标准差1.2、箱线图1.3、Z-Score法 二、基于机器学习算法的方法2.1、K-NN2.2、孤立森林 三、基于密度的方法3.1、LOF3.2、DBSCAN密度聚类 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在视频创作中&#xff0c;电影级的视频素材能够为作品增添专业质感&#xff0c;让画面更具冲击力。无论是广告、电影短片&#xff0c;还是品牌宣传&#xff0c;高质量的视频素材都是不可或缺的资源。然而&#xff…

顺序表的操作

注意位序和数组下标的关系 插入&#xff1a; 插入的时间复杂度&#xff1a; 最深层语句&#xff1a; 最好情况 最坏情况 平均情况 删除&#xff1a; 查找&#xff1a;

五、windows上vscode构建c/c++环境

1、安装vscode 官网下载界面&#xff1a;https://code.visualstudio.com/Download 请根据电脑系统安装所需版本点击下载链接&#xff08;一般情况下点击windows按钮即可&#xff09;鼠标左键双击&#xff0c;即可运行安装程序&#xff0c;点击【确认】&#xff1b;选择安装路径…

Spring实例化的基本流程和Bean处理器

目录 Spring实例化的基本流程 Bean的处理器 Bean工厂后处理器&#xff08;BeanFactoryPostProcessor&#xff09; 动态注册beanDefinition Bean后处理器&#xff08;BeanPostProcessor&#xff09; Spring实例化的基本流程 在了解处理器之前&#xff0c;要清除spring实例化…

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用&#xff08;以后的重点&#xff09; 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…

109.【C语言】数据结构之求二叉树的高度

目录 1.知识回顾&#xff1a;高度&#xff08;也称深度&#xff09; 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾&#xf…

瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 文章目录 3 项目组件优化3.1 实现Swagger文档输出3.2 实现logback日志打印3.3 实现表单校验功能3.4 实现请求参数和响应参数的打印 3 项目组件优化 3.1 实现Swagger文档输出 1&#xff09;在application.yml中增加knife4…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…