Android Room 持久化库的介绍及使用方法

Android Room 是 Android Jetpack 组件之一,是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层,允许开发者在 SQLite 数据库上执行常见的 CRUD 操作,同时处理数据库连接、数据迁移和查询优化等底层细节。

Android Room 的主要优点包括:

  1. 简化的API:Room 提供了简洁的注解和查询语言,使得数据库操作更加直观和易于编写。
  2. 编译时检查:Room 在编译时对 SQL 语句进行检查,可以提前发现错误,避免在运行时出现问题。
  3. 数据库迁移:Room 支持数据库结构的升级和迁移,可以轻松地处理应用程序版本更新时的数据迁移问题。
  4. 响应式编程:Room 结合 LiveData 或 RxJava,可以实现数据库查询的响应式编程,实时更新 UI。

使用 Android Room 的基本步骤包括:

  1. 定义实体类:使用注解在 Java 或 Kotlin 类中定义数据库表和字段。
  2. 创建数据访问对象(DAO):定义用于执行数据库操作的接口或抽象类,并使用注解指定对应的 SQL 查询语句。
  3. 创建数据库:使用注解和数据库配置类来创建数据库,并指定相关的实体类和版本号。
  4. 执行数据库操作:通过调用 DAO 中定义的方法,即可对数据库进行增删改查操作。

Android Room 提供了一个简单而强大的方式来进行数据库操作,是开发 Android 应用程序时的首选选择之一。它的设计理念是为了提供更好的性能、更高的可靠性和更简单的开发体验。

下面是Android Room的基本使用方法。

  1. 添加Room依赖
    在项目的build.gradle文件中,添加以下依赖:

     def room_version = "2.6.1"
    
     implementation "androidx.room:room-runtime:$room_version"
     // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
     // See KSP Quickstart to add KSP to your build
     ksp "androidx.room:room-compiler:$room_version"
    
    
     //如果需要,也可以引入以下依赖
     
     // If this project only uses Java source, use the Java annotationProcessor
     // No additional plugins are necessary
     annotationProcessor "androidx.room:room-compiler:$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:$room_version"
    
  2. 创建实体类
    创建一个Kotlin类,表示数据库中的一个表。例如,如果要创建一个名为"User"的用户表,可以编写如下代码:

    @Entity(tableName = "users")
    data class User(
         @PrimaryKey val id: Int,
         val name: String,
         val age: Int
    )
    
  3. 创建数据访问对象(DAO)
    创建一个接口,用于定义访问数据库的方法。例如,如果要访问"User"表,可以编写如下代码:

    @Dao
    interface UserDao {
        @Insert
        suspend fun insert(user: User)
    
        @Query("SELECT * FROM users")
        suspend fun getAllUsers(): List<User>
    
        @Query("SELECT * FROM users WHERE id = :id")
        suspend fun getUserById(id: Int): User
        
        @Query("SELECT * FROM users WHERE id IN (:ids)")
        suspend fun getUserByIds(ids: List<Int>): List<User>
    
        @Update
        suspend fun updateUser(user: User)
    
        @Delete
        suspend fun deleteUser(user: User)
    }
    
  4. 创建数据库类
    创建一个抽象类,继承自RoomDatabase,并使用@Database注解进行标记。在类中定义一个抽象方法,返回之前创建的DAO接口的实例。例如,如果要创建名为"AppDatabase"的数据库,可以编写如下代码:

     @Database(entities = [User::class], version = 1)
     abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
        
     	companion object {
     	
            @Volatile
            private var INSTANCE: AppDatabase? = null
            //单例
            fun getDatabase(context: Context): AppDatabase {
                return INSTANCE ?: synchronized(this) {
                    val instance = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "app_database")
                        .build()
                    INSTANCE = instance
                    instance
            }
        }
    }
    
  5. 初始化数据库
    在应用程序的入口处,初始化数据库实例。例如,可以将以下代码放在Application类的onCreate()方法中:

    val database = AppDatabase.getDatabase(applicationContext)
    
  6. 使用数据库
    使用之前定义的DAO接口来执行数据库操作。

    // 插入用户
    val user = User(1, "John Doe", 25)
    database.userDao().insert(user)
    
    // 获取所有用户
    val users = database.userDao().getAllUsers()
    
    // 根据id获取用户
    val user = database.userDao().getUserById(1)
    
    //查询指定的多个ID
    val list = listOf(1,2,3)
    val users1 = database.userDao().getUserByIds(list)
    
    // 更新用户
    user.name = "Jane Doe"
    database.userDao().updateUser(user)
    
    // 删除用户
    database.userDao().deleteUser(user)
    

官方链接:https://android-dot-google-developers.gonglchuangl.net/jetpack/androidx/releases/room

Room 和 Flow 简介及应用:https://developer.android.google.cn/codelabs/basic-android-kotlin-training-intro-room-flow

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

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

相关文章

Linux下源码编译安装Nginx1.24及服务脚本实战

1、下载Nginx [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz2、解压 [rootlocalhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/3、安装依赖 [rootlocalhost ~]# yum install gcc gcc-c make pcre-devel openssl-devel -y4、 准备 N…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

《操作系统真象还原》第十三章——磁盘驱动程序

文件系统磁盘创建 创建磁盘 进入bochs安装目录&#xff0c;输入以下命令 ./bin/bximage 然后按照以下步骤创建硬盘 修改硬盘配置 vim boot.disk 添加以下代码行 ata0-slave: typedisk, path"hd80M.img", modeflat,cylinders162,heads16,spt63 完整配置如下 …

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…

v-bind操作class

v-bind操作class 参考文献&#xff1a; Vue的快速上手 Vue指令上 Vue指令下 Vue指令的综合案例 指令的修饰符 文章目录 v-bind操作classv-bind对于样式控制的增强操作class案例(tab导航高亮)操作style操作style案例 结语 博客主页: He guolin-CSDN博客 关注我一起学习&#…

Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中&#xff0c;我们可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP&#xff0c;主要关注影视搜索页的功能实现。 为什么选择nutpi/axios&#xff1f; n…

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…

好用的php商城源码有哪些?

选择一个优秀的商城工具&#xff0c;能更好地帮助大家建立一个好用的商城系统。目前比较流行的都是开源PHP商城系统&#xff0c;那么现实中都有哪些好用的PHP商城源码值得推荐呢&#xff1f;下面就带大家一起来了解一下。 1.TigShop 【推荐指数】&#xff1a;★★★★★☆ 【推…

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…

Open FPV VTX开源之嵌入式OSD配置

Open FPV VTX开源之嵌入式OSD配置 1. 源由2. 安装3. 配置步骤一&#xff1a;备份/etc/telemetry.conf步骤二&#xff1a;修改/etc/telemetry.conf步骤三&#xff1a;配置时区步骤四&#xff1a;重启摄像头 4. 实测5. 参考资料 1. 源由 穿越机模拟图传延迟通常在10ms左右。 最…

数据平台浅理解

定义 数据平台架构是指用于收集、存储、处理和分析数据的一系列组件、技术和流程的整体架构设计。它就像是一个复杂的数据生态系统的蓝图&#xff0c;旨在高效地管理数据从产生源头到产生价值的整个生命周期。 主要层次 数据源层 这是数据的起点&#xff0c;包含各种类型的数据…

CSS3的aria-hidden学习

前言 aria-hidden 属性可用于隐藏非交互内容&#xff0c;使其在无障碍 API 中不可见。即当aria-hidden"true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除&#xff0c;这可以通过隐藏来改善辅助技术用户的体验&#xff1a; 纯装饰性内容&#xff0c;如…

【ArcGIS初学】产生随机点计算混淆矩阵

混淆矩阵&#xff1a;用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) &#xff1a;某类中正确分类的像元数除以参考数据中该类的像元数(列方向)&#xff0c;又称…

认识机器学习中的结构风险最小化准则

上一篇文章我们学习了关于经验风险最小化准则&#xff0c;其核心思想是通过最小化训练数据上的损失函数来优化模型参数&#xff0c;从而提高模型在训练集上的表现。但是这也会导致一个问题&#xff0c;经验风险最小化原则很容易导致模型在训练集上错误率很低&#xff0c;但在未…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…

Chatper 4: Implementing a GPT model from Scratch To Generate Text

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture4.2 Normalizing activations with layer normalization4.3 Implementing a feed forward network with GELU activations4.4 Adding shortcut connections4.5 Connecting at…

Unity ShaderGraph中Lit转换成URP的LitShader

ShaderGraph中的LitShader如下&#xff1a; 在顶点和片元着色器暴露出了上图中的几个参数&#xff0c;要转换成URPLitShaderLab,首先要找到这几个参数&#xff0c;打开LitShader&#xff0c;找到第一个Pass&#xff0c;可以看到下图中的顶点和片元的定义函数&#xff0c;还有引…

uni-app的学习

uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架&#xff0c;能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…