福建师范大学Android Room 技术浅谈

news2024/12/23 15:01:50

福建师范大学Android Room 技术浅谈

## 前提告知该文章是用作课程评分,本文内容虽为原创,但也有参考。

1.Room的背景简介

处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的使用场景是缓存相关的数据,这样一来,当设备无法访问网络时,用户仍然可以在离线状态下浏览该内容。

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

2.Room的优点

  • 使用编译时注解,能够对@Query和@Entity里面的SQL语句等进行验证;
  • 与SQL语句的使用更加贴近,能够降低学习成本,提交开发效率,减少模板代码;
  • @Embedded 能够减少表的创建;
  • 对LiveData、Kotlin Coroutines的支持

3.Room三大组件

1.Database: 可以使用此组件创建数据库 holder,注释定义实体列表,和类的内容定义数据访问对象(DAO)数据库中的表。它也是基本连接的主要访问点。
2.Entity: 实体类对象模型,一般对应表结构。实体的每个字段在数据库中都是保存的,除非你用@Ignore 注解。
3.DAO:全称Database Access Object,定义了对数据库中数据的读写等操作,DAO中可以使用SQL语句来操作数据库。

4.android Room 依赖的配置

在build.gradle 文件的 dependencies添加一下代码:

    implementation fileTree(dir:'libs',include:['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.room:room-common:2.3.0'
    implementation 'androidx.room:room-runtime:2.3.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:esprsso-core:3.2.0'
    implementation 'com.google.andrid.material:material:1.1.0'
    implementation 'andrid.arch.presistence.room:runtime:1.1.1'
    annotationProcessor 'andrid.arch.presistence.room:compiler:1.1.1'
    annotationProcessor 'androidx.room:room-compiler:2.3.0'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvvSwCVZ-1670507203385)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

5.1Entity(创建表)

@Entity(tableName = "table_name")
public class MainData implements Serializable {
    //创建ID列
    @PrimaryKey(autoGenerate = true)
    private  int ID;
    //创建下一列
    @ColumnInfo(name = "text")
    private String text;
    //生成getter和setter

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7gB8tq1-1670507203387)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

5.2Dao

@Dao
public interface MainDao {
    //插入语句
    @Insert(onConflict = REPLACE)
    void insert(MainData mainData);

    //删除语句
    @Delete
    void delete(MainData mainData);

    //删除全部的语句
    @Delete
    void reset(List<MainData> mainData);

    //更新语句
    @Query("UPDATE table_name SET text= :sText WHERE ID = :sID" )
    void update(int sID,String sText);

    //查询所有数据
    @Query("select * from table_name")
    List<MainData> getAll();
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZrWnSFi-1670507203388)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

在这个里面定义了,对应数据库的操作。

@Insert@Delete@Update@Query 代表我们常用的插入、删除、更新、查询数据库操作。

@Query非常的强大,你可以编写任意sql语句并得到你想要的结果。

5.3DataBase

// 添加数据库 实体
@Database(entities = {MainData.class}, version = 1,exportSchema = false)
public abstract class RoomDB extends RoomDatabase{
    //创建 数据库 实例
    private  static RoomDB database;
    //定义数据库的名字
    private static String DATABSAE_NAME="database";
    public synchronized static RoomDB getInstance(Context context){
        //检测状态
        if(database==null){
            //数据库为空时就初始化数据库
            database = Room.databaseBuilder(context.getApplicationContext(),
                    RoomDB.class,DATABSAE_NAME).allowMainThreadQueries()
                    .fallbackToDestructiveMigration()
                    .build();
        }
        return database;
    }

    //创建Dao
    public abstract MainDao mainDao();
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmTccfjK-1670507203389)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

这里运用到数据库单例模式,下面会仔细讲讲为什么把数据库写成单例。

5.4单例模式简单介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式有两种:饿汉式懒汉式

我使用的是懒汉式,这里先说一下饿汉式与懒汉式的区别:

饿汉式:类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。

懒汉式:懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。

在线程安全上:

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,

懒汉式本身是非线程安全的,为了实现线程安全有几种写法。

在资源加载和性能上:

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

可以发现,两者各有缺点和优点,因为我自己写的是一个小案例,涉及不到多线程,所以就用的懒汉式模式。

6.使用

​ 1.注意事项:需要在工作线程中使用,否则耗时操作将会导致Application崩溃

​ 2.获取数据库

 //数据库变量赋值
 database = RoomDB.getInstance(this);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQW1FF4U-1670507203389)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

​ 3.更新数据

String uText = editText.getText().toString().trim();
//更新数据库数据
database.mainDao().update(sID,uText);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pnbWX7mE-1670507203390)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

​ 4.插入数据

MainData data = new MainData();
data.setText(sText);
database.mainDao().insert(data);
//清空 edit text
editText.setText("");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JWIl2gDS-1670507203391)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

7.效果展示

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TcTrO3B-1670507203392)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑

8.源码

肖学良
t.setText(“”);


[外链图片转存中...(img-JWIl2gDS-1670507203391)]

##  7.效果展示

![img](https://img-blog.csdnimg.cn/9cad2a3538bf4b1c8d9ed3e00b46826b.gif)[外链图片转存中...(img-7TcTrO3B-1670507203392)]编辑

##  8.源码
肖学良
https://download.csdn.net/download/weixin_53445186/87218017

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

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

相关文章

JVM虚拟机内存结构详解,一文带你学习完80%的知识

程序计数器 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记录下一条 jvm 指令的执行地址行号特点&#xff1a; 是线程私有的&#xff0c;随着线程创建而创建&#xff0c;随着线程销毁而销毁不会存在内存溢出是一块较小的内存…

CVPR 2019|APCNet:基于全局引导的局部匹配度自适应金字塔上下文网络

&#x1f3c6;本篇论文发现了一种全局引导的局部匹配度&#xff08;Global-guided Local Affinity (GLA))特征&#xff0c;用于构造上下文语义信息。基于此特性&#xff0c;作者设计了自适应上下文模块&#xff0c;构建自适应金字塔上下文网络&#xff08;APCNet&#xff09;。…

手工测试2年面临职场危机,3个月进阶自动化测试后,老板终于留我了...

​前言 从学校到职场已经3年时间了&#xff0c;大学学的计算机专业&#xff0c;最开始事项从事java开发的&#xff0c;最终被现实打败&#xff0c;然后就从事了软件测试&#xff0c;现在已近过去了2年&#xff0c;为什么说是2年了&#xff0c;大学毕业有一段空窗期&#xff0c…

大数据面试之HDFS常见题目

大数据面试之HDFS常见题目 HDFS常见题目 1 HDFS读流程和写流程 1.1 读流程&#xff08;下载&#xff09; 文字描述&#xff1a; ​ 客户端将要读取的文件路径发送给 NameNode&#xff0c;NameNode 获取文件的元信息&#xff08;主要是 block 的存放位置信息&#xff09;返回…

美团外卖推荐智能流量分发的实践与探索

总第548篇2022年 第065篇美团外卖推荐团队在推荐算法的长期落地实践中&#xff0c;针对外卖业务情境化特点对排序模型进行深入探索与优化。本文介绍了面向情境化建模的“情境细分统一模型”建模思路&#xff0c;通过用户行为序列建模以及专家网络两个模块的优化&#xff0c;实现…

简单实用:css+html绘制常见图表

提到绘制图表&#xff0c;大家可能想到ECharts&#xff0c;其实&#xff0c;一些简单的图表可以直接通过csshtml实现&#xff0c;下面手把手带大家绘制&#xff0c;初学者也能轻松掌握。 1 csshtml绘制柱形图 我们先写一个超简单的html文件。 <div class"bargraph&q…

多维数组地址映射问题的求解(3维、4维为例)——数据结构

在上篇我大概介绍了多维数组的地址映射问题&#xff0c;但是不够完善&#xff0c;很多朋友还没有彻底学会&#xff0c;表示很头疼。这一方面的总结确实比较少&#xff0c;而且也很麻烦&#xff0c;但是不要怕&#xff0c;看完我的总结&#xff0c;相信你一定会有一直醍醐灌顶的…

《2022中国PaaS市场研究及选型评估报告》正式发布

《中智观察》第1741篇推送作者&#xff1a;海比研究院编辑&#xff1a;晓晓编审&#xff1a;赵满头图来源&#xff1a;中国软件网从2006年概念兴起至今&#xff0c;云计算已经在国内走过整整十五年的历程。云计算的三大模式SaaS、PaaS、IaaS从陌生到熟悉&#xff0c;从研发到应…

ML Journal6—OpenCV中的GUI功能

图像入门这是将在本教程中使用的图像borz.jpgimport cv2 as cv import sysimg cv.imread(borz.jpg) if img is None:sys.exit("Could not read the file.") cv.imshow("Display Window", img) k cv.waitKey(0) if k ord("s"):cv.imwrite(&quo…

《自己动手写CPU》学习记录(5)——第5章/Part 1

目录 引言 致谢 流水线的数据相关问题 问题分析 RAW类型 1、相邻指令数据相关 2、间隔1条指令数据相关 3、间隔2条指令数据相关 修改后的代码 译码模块 指令执行模块 顶层模块 测试 测试代码 生成.data初始化文件 仿真结果 引言 随章节进度继续推进&#xff0c…

【视频】马尔可夫链原理可视化解释与R语言区制转换MRS实例|数据分享

原文链接&#xff1a;http://tecdat.cn/?p12280马尔可夫链是从一个“状态”&#xff08;一种情况或一组值&#xff09;跳到另一个“状态”的数学系统。本文介绍了马尔可夫链和一种简单的状态转移模型&#xff0c;该模型构成了隐马尔可夫模型&#xff08;HMM&#xff09;的特例…

近期方案研究总结(那些你用的到的排列组合)

方案一 这个方案只一个位置一个号码&#xff0c;标的物即一个位置八十期不重即可以切入&#xff0c;以这样的思路去进行扩充。 纬度一 两期重复形态为&#xff1a;11、22、33、44、55、66、77、88、99、1010。 数上升一形态为&#xff1a;12、23、34、45、56、67、78、89、910…

微服务框架 SpringCloud微服务架构 28 数据同步 28.6 测试同步功能

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.6 测试同步功能28.6.1 直接开干28 数据同步 28.6 测试同步…

云安全系列5:2023 年需要了解的 40个云安全术语

云安全具有广泛而复杂的特点&#xff0c;它有许多特定的术语和首字母缩略词。我们在这里整理了一些云安全术语。将其用作指南&#xff0c;可帮助您了解云安全的细微差别并更便于学习相关内容。 Agent 代理是专门的软件包或应用程序&#xff0c;部署到设备或机器上以完成与安全…

IDEA:Idea 集成 EasyYApi 插件实现接口文档的生成与更新

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。如果小伙伴们觉得不错就一键三连吧~ 声明&#xff1a;文章原文来源处&#xff1a; https://blog.csdn.net/weixin_40863968/article/details/122432678https://www.jianshu.com/p/cd91590…

10个知识点让你读懂Spring MVC容器

DispatcherServlet 的配置参数 可以通过的属性指定配置参数&#xff1a; namespace参数&#xff1a;DispatcherServlet对应的命名空间&#xff0c;默认是WEB-INF/-servlet.xml。在显式配置该参数后&#xff0c;新的配置文件对应的路径是WEB-INF/.xml&#xff0c;例如如果将name…

Android 移植iperf3.13 测试网络

iperf,测试网络性能的&#xff0c;不同于 webrtc里面的gcc 算法预估网络带宽&#xff0c;iperf是实际占用网络来传输数据测量实际的网络性能。 官网&#xff1a;https://iperf.fr/ 官方就有 android 的下载 https://iperf.fr/iperf-download.php#android&#xff0c; 但是看起…

绕线机算法模型(Simulink仿真验证+PLC代码实现)

绕线机应用的详细内容大家可以参看下面这篇博客,这里不再赘述。本文主要借助Simulink仿真分析和解决工程实际问题。希望对大家学习Simulink有所帮助。限于水平和能力所限,文中难免出现错误和不足之处,诚恳的希望大家批评和指正。 S7-200 SMART PLC和V20变频器绕线机控制应用…

Linux(在 Linux 上搭建 java 部署环境(安装jdk/tomcat/mysql) + 将程序部署到云服务器上的操作)

目录 &#x1f432; 1. 在 Linux 上搭建 java 部署环境 &#x1f984; 1.1 安装 jdk &#x1f984; 1.2 安装 tomcat &#x1f984; 1.3 安装 mysql &#x1f432; 2. 将[博客系统]部署到云服务器上 &#x1f984; 2.1 先在云服务器上,创建和之前 windows 上一样的数据库…

德勤、阿里为数据智能时代造势,是风口还是韭菜?

前不久&#xff0c;德勤和阿里高调发布了业内首个DAAS报告《DAAS数字化新世代的最优解》&#xff0c;强调“企业不应该继续将数据智能建设当作‘选择题’&#xff0c;而是一道‘必答题’&#xff01;” 德勤管理咨询中国首席执行官戴耀华&#xff08;右&#xff09;与阿里巴巴集…