【JetPack】Room数据库笔记

news2024/12/23 3:51:07

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();

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

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

相关文章

基于前端技术UniApp和后端技术Node.js的电影购票系统

文章目录 摘要Abstruct第一章 绪论1.1 研究背景与意义1.2 国内外研究现状 第二章 需求分析2.1 功能需求分析2.2 非功能性需求分析 第二章系统设计3.1 系统架构设计3.1.1 总体架构3.1.2 技术选型 3.2 功能架构 第四章 系统实现4.1 用户端系统实现4.1.1 用户认证模块实现4.1.2 电…

大模型微调---Lora微调实战

目录 一、前言二、LoRA实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、LoRA微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 LoRA是一种参数高效的微调技术&#xff0c;通过低秩转换对大型语言模型进行适应性更新&#xff0c;减少…

centos7下docker 容器实现redis主从同步

1.下载redis 镜像 docker pull bitnami/redis2. 文件夹授权 此文件夹是 你自己映射到宿主机上的挂载目录 chmod 777 /app/rd13.创建docker网络 docker network create mynet4.运行docker 镜像 安装redis的master -e 是设置环境变量值 docker run -d -p 6379:6379 \ -v /a…

SLAAC如何工作?

SLAAC如何工作&#xff1f; IPv6无状态地址自动配置(SLAAC)-常见问题 - 苍然满关中 - 博客园 https://support.huawei.com/enterprise/zh/doc/EDOC1100323788?sectionj00shttps://www.zhihu.com/question/6691553243/answer/57023796400 主机在启动或接口UP后&#xff0c;发…

2024.12.21辩论赛感受

背景 今天辩论赛的双方论点是&#xff1a; 正方&#xff1a;寒假留在研发中心的收获大 反方&#xff1a;寒假去做其他事情的收获 辩论赛&#xff0c;为了锻炼自己&#xff0c;选择了不想选择以及相对不好辩论的反方。出现的状况有一下几点&#xff1a; 1.发现自己脑子完全跟不…

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

C语言:文件IO

C语言&#xff1a;文件IO 文件操作 概述 什么是文件 文件是保存在外存储器&#xff08;一般代指磁盘&#xff0c;U盘&#xff0c;移动硬盘等&#xff09;的数据的集合 文件操作体现在哪几个方面 文件内容的读取文件内容的写入 数据的读取和写入可被视为针对文件进行输入&…

时间序列异常值处理方法

文章目录 一、删除法二、替换法三、插值法四、滑动窗口五、基于模型的替换 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任务—tsfresh python时间序列处理 有季节效应的非平稳序列分析 时间序列异常值检测方法 时间序列…

【报错】node:internal/modules/cjs/loader:936

报错问题&#xff1a; 当执行npm run dev后&#xff0c;出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的&#xff0c;解决此问题的一种方法就是重新安装所需的模块。 解决办法&#xff1a; 删除npm install 所下载在项目里的node_modules文件执行操作&…

故障诊断 | 一个小创新:特征提取+KAN分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

javac 编译java文件源码 怎么生成 ast语法树 步骤详解

在 javac 中&#xff0c;编译源代码并生成抽象语法树&#xff08;AST&#xff09;是一个多步骤的过程&#xff0c;涉及从源码解析到最终生成字节码。以下是详细步骤&#xff0c;描述了如何使用 javac 编译源码并生成 AST。 1. 准备源文件 javac 首先需要源文件。这些源文件是…

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…

Linux 安装Nginx 并配置启动 (已实测)

文章目录 一、安装Nginx二、配置 Nginx 为系统服务 一、安装Nginx 安装依赖&#xff0c;确保Nginx编译和运行正常&#xff0c;打开终端执行以下命令 yum install -y wget gcc-c pcre-devel zlib-devel openssl-devel下载Nginx # 例如&#xff0c;下载Nginx 1.24.0版本 wget …

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR&#xff08;Master Boot Record&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT&#xff08;GUID Partition Table&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹

本文记录当前最新版虚拟机VMware Workstation Pro&#xff08;2024.12&#xff09;如何在win11下共享文件&#xff0c;以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机&#xff0c;打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…

2024 年的科技趋势

2024 年在科技领域有着诸多重大进展与突破。从人工智能、量子计算到基因组医学、可再生能源以及新兴技术重塑了众多行业。随着元宇宙等趋势的兴起以及太空探索取得的进步&#xff0c;未来在接下来的岁月里有望继续取得进展与突破。让我们来探讨一下定义 2024 年的一些关键趋势&…

python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django

windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …

厦门凯酷全科技有限公司短视频带货可靠吗?

在当今这个数字化时代&#xff0c;抖音作为短视频和直播带货的领军平台&#xff0c;已经吸引了无数商家的目光。而在这一片繁荣的电商蓝海中&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&#xff09;凭借其专业的团队、丰富的经验和创新的服务模式&#…

从源码分析swift GCD_DispatchGroup

前言&#xff1a; 最近在写需求的时候用到了DispatchGroup&#xff0c;一直没有深入去学习&#xff0c;既然遇到了那么就总结下吧。。。。 基本介绍&#xff1a; 任务组&#xff08;DispatchGroup&#xff09; DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…