Android Room的使用详解

news2024/11/15 21:56:53

Android Room的使用详解

一:Room的基本介绍

 Room 是 Android 架构组件的一部分,Room 持久性库在 SQLite
 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的
 同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:
  • 针对 SQL 查询的编译时验证。
  • 可最大限度减少重复和容易出错的样板代码的方便注解。
  • 简化了数据库迁移路径

二:Room 库由 3 个主要组件组成:

实体:

Entity 表示数据库中的一个表,必须用@Entity 进行注释。每个实体至少包含一个字段,必须定义一个主键。

DAO(数据库访问对象):

在 Room 中,您可以使用数据访问对象来访问和管理您的数据。DAO 是 Room 的主要组件,包括提供对您的应用程序数据库的访问的方法,它必须用@Dao注释。使用 DAO 代替查询构建器,让您分离数据库的不同组件,例如当前数据和统计信息,这使您可以轻松测试数据库。

数据库:

作为数据库持有者,是关系数据的主要访问点。它必须用@Database注释并扩展RoomDatabase。它还包含并返回 Dao(数据库访问对象)。

​​在这里插入图片描述

三:在 Android 应用程序中实现Room数据库

​​​​​​第一步:创建一个 Empty Activity 项目

    创建一个空的活动项目,并选择Kotlin作为语言。

第二步:添加所需的依赖项

    将以下依赖添加到应用级gradle 文件中。通过转到

    ProjectName -> src -> build.gradle.
dependencies {
    val room_version = "2.4.3"

    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")
    // To use Kotlin Symbol Processing (KSP)
    ksp("androidx.room:room-compiler:$room_version")

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")

    // optional - RxJava2 support for Room
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:2.5.0-beta02")
}


第三步:创建数据实体

    创建一个名为 User.kt的示例数据类。

    并调用以下代码,其中包含实体User作为实体,它表示行,first_ name、last_name、 age 表示表的列名。

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
 
@Entity
data class User(
	@PrimaryKey(autoGenerate = true) val uid: Int,
	@ColumnInfo(name = "name") val firstName: String?,
	@ColumnInfo(name = "city") val lastName: String?
)

第四步:创建数据访问对象(DA0):

    现在创建一个名为UserDao.kt的接口。

    并调用以下代码,它提供了应用程序用来与用户交互的各种方法。

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
 
@Dao
interface UserDao {
	@Query("SELECT * FROM user")
	fun getAll(): List<User>
 
	@Query("SELECT * FROM user WHERE uid IN (:userIds)")
	fun loadAllByIds(userIds: IntArray): List<User>
 
	@Insert
	fun insertAll(vararg users: User)
 
	@Delete
	fun delete(user: User)
}


第五步:​​​​​​​创建数据库

    现在创建定义实际应用程序数据库的数据库,它是应用程序持久数据的主要访问点。这个类必须满足:

    1、类必须是抽象的。

    2、该类应该用@Database注释。

    3、数据库类必须定义一个带有零参数的抽象方法并返回一个 DAO 实例。

    现在在AppDatabase.kt文件中调用以下代码。
import androidx.room.Database
import androidx.room.RoomDatabase
  
@Database(entities = arrayOf(User::class), version = 1)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

第六步:Room 数据库的使用

在MainActivity.kt文件中,我们可以通过为数据库提供自定义名称来创建数据库
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.room.Room
 
class MainActivity : AppCompatActivity() {
 
	// application's Database name
	private val DATABASE_NAME: String = "USER_DATABASE"
 
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)
 
		// get the instance of the application's database
		val db = Room.databaseBuilder(
			applicationContext, UserDatabase::class.java, DATABASE_NAME
		).build()
 
		// create instance of DAO to access the entities
		val userDao = db.userDao()
 
		// using the same DAO perform the Database operations
		val users: List<User> = userDao.getAll()
	}
}


作者:林江鹏
原文链接:https://blog.csdn.net/m0_52768965/article/details/128064067?spm=1001.2014.3001.5501

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

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

相关文章

【Linux Kernel 6.1 代码剖析】- 进程管理概论

目录 进程与线程的概念&#xff08;内核线程和用户线程&#xff09; 进程的3种基本状态 引入挂起后的7种基本状态 Linux 内核6.1 - 进程的8种详细状态 进程控制块 PCB SMP 架构 进程与线程的概念&#xff08;内核线程和用户线程&#xff09; 进程是正在运行的程序实体&a…

基于java+ssm+vue+mysql的旅游管理系统

项目介绍 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多企业的之中&#xff0c;随之就产生了“旅游信息管理系统”&#xff0c;这样就让旅游信息管理系统更加方便简单。 对于本旅游信息管理系统的设计来说&…

QDir(目录)

QDir 类提供对目录结构及其内容的访问&#xff0c;QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统&#xff0c;它也可以用来访问Qt的资源系统。 Qt使用“/”作为通用目录分隔符&#xff0c;就像URL中的“/”用作路径分隔符一样。如果您始终使用“/”作为…

2022年大一学生实训作业【基于HTML+CSS制作中华传统文化传统美德网站 (6页面)】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【YOLOv7/YOLOv5系列算法改进NO.47】改进激活函数为GELU

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

SparkSQL - 介绍及使用 Scala、Java、Python 三种语言演示

一、SparkSQL 前面的文章中使用 RDD 进行数据的处理&#xff0c;优点是非常的灵活&#xff0c;但需要了解各个算子的场景&#xff0c;需要有一定的学习成本&#xff0c;而 SQL 语言是一个大家十分熟悉的语言&#xff0c;如果可以通过编写 SQL 而操作RDD&#xff0c;学习的成本…

ARM汇编之程序状态寄存器传输指令

ARM汇编之程序状态寄存器传输指令前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; CLZ指令的常见使用场景&#xff1b;状态寄存器访问指令有哪些&#xff1f; 今天&#xff0c;我们来一起探索并回答这些问题。为了便于大家理解&#xff0c;以下是…

[附源码]Python计算机毕业设计SSM金牛社区疫情防控系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]JAVA毕业设计老年人健康饮食管理系统(系统+LW)

[附源码]JAVA毕业设计老年人健康饮食管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

LeetCode 0542. 01 矩阵

【LetMeFly】542.01 矩阵 力扣题目链接&#xff1a;https://leetcode.cn/problems/01-matrix/ 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示…

MySQL数据库之存储引擎

MySQL数据库之存储引擎数据存储引擎介绍MyISAM数据引擎概述MyISAM的特点介绍及数据引擎对应文件MyISAM的存储格式分类MyISAM适用的生产场景举例InnoDB数据引擎概述InnoDB特点介绍及数据引擎对应文件InnoDB适用生产场景分析企业选择存储引擎的依据如何配置存储引擎查看系统支持的…

c<8>指针

目录 2&#xff0c;指针的赋值 2.1C语言允许指针赋值为0&#xff08;初始化&#xff09; 2.2指针赋值例 2.3输出指针的值 3&#xff0c;用指针引用数组 3.1利用指针输入数组 3.2优先级问题 4.多维数组 5.字符串 5.1通过指针引用字符串 4.函数中对指针的应用 4.1将指针变…

[附源码]计算机毕业设计车源后台管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Acer W700废物利用- 第一章 - 安装Linux系统Debian 11.5

前言 收拾房子时在犄角旮旯发现了一台N年前的Windows平板&#xff0c;也就是今天的主角&#xff1a;Acer W700 &#xff0c;机器配置是&#xff1a;CPU&#xff1a;I5-3337U&#xff1b;内存&#xff1a;4G&#xff1b;硬盘&#xff1a;128G固态&#xff1b; 插上充电线&…

YOLOv5图像分割--SegmentationModel类代码详解

目录 ​编辑 SegmentationModel类 DetectionModel类 推理阶段 DetectionModel--forward() BaseModel--forward() Segment类 Detect--forward SegmentationModel类 定义model将会调用models/yolo.py中的类SegmentationModel。该类是继承父类--DetectionModel类。 cl…

数学基础从高一开始1、集合的概念

数学基础从高一开始1、集合的概念 目录 数学基础从高一开始1、集合的概念 一、课程引入 解析&#xff1a;方程​编辑2是否有解&#xff1f; 解析&#xff1a;所有到定点的距离等于定长的点组成何种图形&#xff1f; 结论&#xff1a; 二、课程讲解 问题1&#xff1a; 集…

1548_AURIX_TC275_锁步比较逻辑LCL

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这可能是这段时间看过的最简单的一个章节了&#xff0c;所有的章节内容都可以放进这一份笔记也不显得多。 1. 首先明确LCL的意思&#xff0c;其实是锁步核比较器逻辑的意思&#xff0c;还不…

知识点1--认识Docker

IT界2014年之前&#xff0c;对于服务器虚拟化的使用&#xff0c;有过一个流派&#xff0c;基于Windows server系统VMware组成服务器集群&#xff0c;但是后期由于这样的使用方式维护成本相当高&#xff0c;比如服务器的序列、服务器台账以及服务器与服务器之间的切换等等&#…

据说Linuxer都难忘的25个画面

虽然对 Linux 正式生日是哪天还有些争论&#xff0c;甚至 Linus Torvalds 认为在 1991 那一年有四个日子都可以算作 Linux 的生日。但是不管怎么说&#xff0c;Linux 已经 25 岁了&#xff0c;这里我们为您展示一下这 25 年来发生过的 25 件重大里程碑事件。 1991&#xff1a;L…

SpringMVC学习笔记二(获取Cookies、Session和Header、IDEA热部署)

目录 一、一些前置知识 二、SpringMVC获取cookies和session &#x1f351;获取cookies和header &#x1f351;获取session 三、SpringMVC热部署 &#x1f4dd;添加框架支持 &#x1f4dd;settings配置开启自动热部署 &#x1f4dd;开启运行中热部署&#xff1a; &…