Andoird使用Room实现持久化及使用Room进行增删查改

文章目录

  • Room概述
  • Room的使用
    • 一、在gradle.build中添加依赖库
      • kotlin
      • Java
    • 创建实体类
    • 创建抽象Dao层接口
    • 创建DataBase层
    • 使用创建的
    • 查看数据库
  • 总结:

这篇文章会告诉你如何在Android中通过kotlin或者Java来实现数据持久化

Room概述

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

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

  • 提供针对 SQL 查询的编译时验证。
  • 提供方便注解,可最大限度减少重复和容易出错的样板代码。
  • 简化了数据库迁移路径。

Room 包含三个主要组件:

  • 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体,用于表示应用的数据库中的表。
  • 数据访问对象(DAO),为您的应用提供在数据库中查询、更新、插入和删除数据的方法。

数据库类为应用提供与该数据库关联的 DAO 的实例。反过来,应用可以使用 DAO 从数据库中检索数据,作为关联的数据实体对象的实例。此外,应用还可以使用定义的数据实体更新相应表中的行,或者创建新行供插入。图 1 说明了 Room 的不同组件之间的关系。

在这里插入图片描述

Room的使用

一、在gradle.build中添加依赖库

kotlin

需要先在build.gradle.kts中添加kapt插件

  • build.gradle(app)
alias(libs.plugins.jetbrainsKotlinKapt)
  • 项目的build.gradle.kts中也需要添加
plugins {
    alias(libs.plugins.jetbrainsKotlinKapt) apply false
}

然后再app的gradle中添加如下依赖

    //room依赖
    val room_version = "2.6.1"
    implementation("androidx.room:room-runtime:$room_version")
    // To use Kotlin annotation processing tool (kapt)
    kapt("androidx.room:room-compiler:$room_version")

Java

添加插件:

plugins {
    id 'org.jetbrains.kotlin.kapt'
}

添加依赖:

    def room_version = "2.6.1"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"

创建实体类

1.创建User实体类

@Entity(tableName = "user2")
data class User(
        @ColumnInfo(name = "username")
        var userName: String? = null,
        @ColumnInfo(name = "password")
        var userPassword: String? = null
        ) {

        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "id")
        var id: Int = 0
}

2.添加注解:

  • 默认情况下,Room 将类名称用作数据库表名称。如果您希望表具有不同的名称,请设置 @Entity 注解的 tableName 属性。
  • Room 默认使用字段名称作为数据库中的列名称。如果您希望列具有不同的名称,请将 @ColumnInfo 注解添加到该字段并设置 name
    属性。
  • 每个 Room 实体都必须定义一个主键,用于唯一标识相应数据库表中的每一行。执行此操作的最直接方式是使用 @PrimaryKey
    为单个列添加注解(注意:如果您需要 Room 为实体实例分配自动 ID,请将 @PrimaryKey 的 autoGenerate
    属性设为 true。)
  • 默认情况下,Room 会为实体中定义的每个字段创建一个列。 如果某个实体中有您不想保留的字段,则可以使用 @Ignore
    为这些字段添加注解
    在这里插入图片描述

创建抽象Dao层接口

interface UserDao {
    @Query("SELECT * FROM user2")
    fun getAll(): List<User>

    @Delete
    fun delete(user: User)

    @Update
    fun updateUsers(vararg users: User)
	
	//这个注解表示如果数据已在数据库中存在增进行替换
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(users: List<User>)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(user: User)
    //返回User的id值,判断是否添加成功
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertReturnId(user: User) : Long

    @Query("SELECT * FROM user2 WHERE username = :userName AND password = :userPassword")
    fun queryUser(userName: String, userPassword: String): User?
}

创建DataBase层

这里通过单例双重验证进行创建

//这里exportSchema
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDataBase : RoomDatabase() {
    companion object {
        private var instance: UserDataBase? = null

        fun getInstance(context: Context): UserDataBase? {
            if (instance == null) {
                synchronized(Companion::class.java) {
                    if(null == instance) {
                        instance = Room.databaseBuilder(context, UserDataBase::class.java, "user.db")
                                .addMigrations()
                                .allowMainThreadQueries()//表示允许在主线程中进行数据库的操作
                                .build()
                    }
                }
            }
            return instance
        }
    }
    abstract fun getUserDao(): UserDao
}

注:可能会报 Schema export directory is not provided to the annotation processor异常
有两种方式解决:
1.在Database注解中添加 exportSchema = false
2.在app的build.gradle中的defaultConfig下添加以下配置

javaCompileOptions {
    annotationProcessorOptions {
        arrayOf("room.schemaLocation" to "$projectDir/schemas")
    }
}
  • 该类必须带有 @Database 注解,该注解包含列出所有与数据库关联的数据实体的 entities 数组。
  • 该类必须是一个抽象类,用于扩展 RoomDatabase。
  • 对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。

使用创建的

 val userDataBase = UserDataBase.getInstance(this)

//在子线程中去运行
 userDataBase?.runInTransaction {
	val userDao: UserDao = db.userDao()
    val users = userDao.getAll()
}

查看数据库

通过Android Studio自带的工具就能够查看
在这里插入图片描述
或者在Device Explorer中的data/data/包名下的databases目录中,将db文件拉出来用其他数据库工具查看
在这里插入图片描述

总结:

Room基本用法已经讲完了,更多详细内容请看 官方文档:https://developer.android.google.cn/training/data-storage/room?hl=zh-cn#groovy
像数据库持久化的其他开源框架还有LitPal等
LitePal介绍
参考文章:
Android-第十三节04Room框架详解

Room 的引入及使用

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

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

相关文章

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …

Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统 一、思路 简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互 书的属性有 书名 作者 类型 价格 借阅状态 而用户可以分为 普通用户 管理员 使用数组将书统一管理起来 用户对这个数组进行操作 普通用户可以进…

Axure RP 10汉化版修改文字

效果 安装目录 lang/default Axure 10 RP 汉化包&#xff08;概览改图层&#xff09;

Express 的 req 和 res 对象

新建 learn-express文件夹&#xff0c;执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

单机一天轻松300+ 最新微信小程序拼多多+京东全自动掘金项目、

现代互联网经济的发展带来了新型的盈利方式&#xff0c;这种方法通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;以此给商家带来增加的流量&#xff0c;同时为使用者带来利润。实践这一手段无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被…

【东山派Vision K510开发板试用笔记】WiFi配网问题

目录 概述 WiFi配网的修改 悬而未决的问题 概述 最近试用了百问网提供的东山派Vision开发板&#xff0c;DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板&#xff0c;主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发…

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

什么是DDoS流量清洗?

随着互联网的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中分布式拒绝服务&#xff08;DDoS&#xff09;攻击尤为引人关注。为了有效应对这一威胁&#xff0c;流量清洗服务应运而生&#xff0c;成为网络安全领域的一项重要技术。 流量清洗服务是一种专门针对DDoS…

最小生成树【做题记录】c++(Prim,Kruskal)

目录 Prim算法求最小生成树 【算法思想】 【算法实现】 【数据结构设计】 【算法步骤】 【输入输出】 【代码示例】 Kruskal算法求最小生成树 【算法思想】 判断是否会产生回路的方法 【算法描述】 【图的存储结构】 【输入输出】 【代码示例】 Prim算法求最小生…

Reactor设计模式

Reactor设计模式 Reactor模式称为反应器模式或应答者模式&#xff0c;是基于事件驱动的设计模式&#xff0c;拥有一个或多个并发输入源&#xff0c;有一个服务处理器和多个请求处理器&#xff0c;服务处理器会同步的将输入的请求事件以多路复用的方式分发给相应的请求处理器。…

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…

Nginx部署静态网页

1、首先拿到前端给的dist包&#xff0c;上传到服务器指定位置&#xff1a;/ajd/dist 2、找到nginx.conf配置文件&#xff0c;修改 server {listen 9300;server_name xxx.xx.xx.xx;location / {root /ajd/dist;try_files $uri $uri/ /index.html;index index.html …

电赛一等奖!基于TMS320F2812的简易数字频率计

电赛一等奖&#xff01;简易数字频率计设计&#xff08;原理图、PCB、源码、分析报告&#xff09; 这份文件是关于合肥工业大学电气与自动化工程学院的一个项目报告&#xff0c;题目为“基于TMS320F2812的简易数字频率计”。项目由方敏、侯其立、李苗、张巧云四位本科生完成&am…

区块链技术和应用

文章目录 前言 一、区块链是什么&#xff1f; 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器&#xff0c;首先回到数据的存储上&#xff0c;数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据&#xff0c;需要对数据在哪这个抽象的概念进行表述&#xff0c;我们科技树发展过程中把数据在哪用地址表示。一个数…

2. C++服务器编程-信号

什么是信号 其实信号就是一个中断。就是在执行程序的时候突然来了一个信号&#xff0c;然后我们去执行这个新来的程序了&#xff0c;这就是中断。 处理方法 信号的处理方式∶忽略、捕获、默认处理 linux中都有那些信号 man7 signal 比如说kill -9 安装man中文手册 自己百…

单片机LCD1602显示电子时钟设计

基于52单片机电子时钟的设计 摘要 本次设计的多功能时钟系统采用STC89C52单片机为核心器件&#xff0c;利用其定时器/计数器定时和记数的原理&#xff0c;结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来&#xff0c;使得系…

【CSP CCF记录】202012-2 期末预测之最佳阈值

题目 过程 思路 第一次没用前缀和&#xff0c;暴力求解得50分。 采用前缀和方法。 1. 对原数组stu[i]进行排序。 2. 计算前缀和数组s[]&#xff0c;s[i]表示安全指数的y_i的前缀和&#xff0c;即安全指数小于等于y_i时的实际挂科情况&#xff0c;y_i之前有多少个未挂科&am…

边用边充电影响寿命吗?看看计算机指令组成与操作类型

计算机指令集体系结构之指令 指令由操作码和地址码字段组成。 操作码指明了指令要完成的操作。 长度可以固定&#xff1a;比如RISC&#xff08;reduced instruction set computer&#xff09;精简指令集计算机 与之对应的RISC&#xff08;复杂指令集计算机&#xff09;&…

【css3】02-css3新特性之选择器篇

目录 1 属性选择器 2 结构伪类选择器 3 其他选择器 :target和::selection ::first-line和::first-letter 4 伪类和伪元素的区别 伪类&#xff08;Pseudo-classes&#xff09; 伪元素&#xff08;Pseudo-elements&#xff09; 伪类和伪元素的区别 1 属性选择器 ☞ 属性选…