Android Room 框架的初步使用

一、简介

Room 是一个强大的对象关系映射库,它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象(称为实体)上。你可以使用简单的注解(如 @Entity@Dao 和 @Database)来定义数据库表、数据访问对象(DAO)和数据库类。

二、使用方法

引入依赖
android {
defaultConfig {
javaCompileOptions {annotationProcessorOptions {arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]}
}

..........

implementation 'androidx.room:room-runtime:2.4.3'

annotationProcessor 'androidx.room:room-compiler:2.4.3'

implementation "androidx.room:room-ktx:2.4.3"

......

编写实体类
package com.test.proxy.entity;import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity(tableName = "student")
public class Student {@PrimaryKey(autoGenerate = true)private int id;@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)private String name;@ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER, defaultValue = "0")private int age;@ColumnInfo(name = "score", typeAffinity = ColumnInfo.INTEGER, defaultValue = "0")private long score;public Student() {}public Student(int id, String name, int age, long score) {this.id = id;this.name = name;this.age = age;this.score = score;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public long getScore() {return score;}public void setScore(long score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", score=" + score +'}';}
}

编写Dao接口
package com.test.proxy.room;import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;import com.test.proxy.entity.Student;import java.util.List;@Dao
public interface StudentDao {@Insertvoid insert(Student student);@Query("SELECT * FROM student")List<Student> getAllStudents();@Query("SELECT * FROM student WHERE name LIKE :searchName")List<Student> findStudentsByName(String searchName);
}

编写数据库配置类
package com.test.proxy.room;import android.content.Context;import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;import com.test.proxy.entity.Student;@Database(entities = {Student.class} , version = 1, exportSchema = false)
public abstract class AppDataBase extends RoomDatabase {public abstract StudentDao studentDao();// 单例模式获取数据库实例public static AppDataBase INSTANCE;public static AppDataBase getInstance(Context context) {if (INSTANCE == null) {synchronized (AppDataBase.class) {if (INSTANCE == null) {INSTANCE = Room.databaseBuilder(context,AppDataBase.class,"app_database").allowMainThreadQueries().build();}}}return INSTANCE;}
}

使用数据库
 public void execute(Context context) {AppDataBase db = AppDataBase.getInstance(context.getApplicationContext());StudentDao studentDao = db.studentDao();Student student = new Student();student.setName("Tom");student.setAge(9);student.setScore(100);studentDao.insert(student);Student student2 = new Student();student2.setName("Amy");student2.setAge(9);student2.setScore(60);studentDao.insert(student2);List<Student> list = studentDao.getAllStudents();for (Student stu : list) {Log.e("TestRoom", "Student :" + stu.toString());}}
打印输出
E  Student :Student{id=1, name='Tom', age=9, score=100}
E  Student :Student{id=2, name='Amy', age=9, score=60}

三、优点

数据的持久化和管理
  • Room 提供了方便的 API 来执行插入、更新、删除和查询操作。你可以方便地使用 DAO 接口中的方法,例如 @Insert@Update@Delete 和 @Query 注解的方法。
数据库迁移
  • 当需要更新数据库的结构(如添加新表或修改列)时,Room 提供了迁移机制,允许你在数据库版本升级时执行 SQL 语句,确保数据的安全性和一致性。
易于使用
  • Room 提供了简洁明了的注解和 API,大大简化了数据库操作。对于熟悉 Java 或 Kotlin 的开发者来说,很容易上手。
  • 示例:通过几个简单的注解和接口定义,就能实现数据库的基本操作,而不需要手动编写大量的 SQL 和 SQLite 操作代码。
编译时检查
  • 由于 Room 在编译时会检查 SQL 语句和数据库配置,所以可以提前发现错误,减少运行时错误的风险。
  • 例如,如果你的 SQL 语句中存在语法错误,编译时会给出相应的错误信息,避免了在运行时出现难以排查的问题。
与 LiveData 和 RxJava 集成
  • Room 可以方便地与 LiveData 集成,允许你观察数据库的变化并自动更新 UI。同时,也可以和 RxJava 集成,使用 RxJava 的操作符处理数据库操作的结果。

四、缺点

学习曲线

对于初学者来说,虽然 Room 已经很简单,但仍然需要一定的时间来熟悉其注解和操作模式,尤其是涉及到数据库迁移等高级功能时。

功能限制

Room 虽然强大,但本质上还是建立在 SQLite 之上,对于一些非常复杂的 SQL 操作或存储过程,可能仍然需要直接编写 SQL 语句,并且一些 SQLite 的高级特性可能不直接被 Room 支持。

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

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

相关文章

UCAS 24秋网络认证技术 CH15 Kerberos复习

Key Distribution Center-KDC 基本流程可分为两大部分&#xff1a;初始认证 和 服务票据获取与使用。 初始认证 Authenticate&#xff1a;客户端向认证服务器&#xff08;Authentication Server&#xff0c;AS&#xff09;发送请求以验证身份。Receive TGT&#xff1a;AS 验证…

字符串模糊匹配-TheFuzz

TheFuzz: 模糊字符串匹配的利器 在日常编程任务中&#xff0c;我们经常需要处理字符串的匹配问题&#xff0c;比如判断两个字符串是否相似、从列表中找到最接近的字符串等。而TheFuzz库&#xff08;前身为fuzzywuzzy&#xff09;就是为了解决这些问题而生的。本文将介绍TheFuz…

C++ 设计模式:职责链模式(Chain of Responsibility)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 组合模式 链接&#xff1a;C 设计模式 - 迭代器模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求…

摄像头监视脚本

摄像头监视脚本&#xff0c;若检测到摄像头画面有变化&#xff0c;保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

vscode remote-ssh 免密登录不生效的问题

一、问题 通过公私钥的方式设置免密登录&#xff0c;设置后每次登录仍需要密码 二、解决方法 可能的原因是 文件/文件夹 权限不对&#xff0c;多权限和少权限都不行 /home/$user 和 /home/$user/.ssh 路径必须是 700 权限 /home/$user/.ssh/authorized_key 必须是 600 权限 比…

管理系统中经典审核功能实现

前言 先简单交代和阐述一下业务背景和逻辑&#xff0c;该系统是一个综合类的音乐系统&#xff0c;上传音乐时&#xff0c;逻辑和qq音乐一样&#xff0c;前端页面就能体现出大概逻辑&#xff0c;如下图所示&#xff1a; 专辑和歌曲是密不可分的&#xff0c;而且歌曲的封面就是对…

AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用

《Effectiveness of ChatGPT in clinical pharmacy and the role of artificial intelligence in medication therapy management》这篇文献研究了ChatGPT在临床药学&#xff0c;特别是在药物治疗管理&#xff08;MTM&#xff09;中的有效性。 一、研究背景 (Background) MTM …

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

css 关于flex布局中子元素的属性flex

css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式&#xff1a; flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析&#xff1a; flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值&#xff1a;0&#…

【gopher的java学习笔记】依赖管理方式对比(go mod maven)

什么是go mod go mod是Go语言官方引入的模块管理工具&#xff0c;旨在简化项目依赖管理&#xff0c;提高构建的可重复性和稳定性。以下是关于go mod的详细介绍&#xff1a; 在go mod之前&#xff0c;Go语言主要依赖GOPATH和vendor目录来管理项目依赖。然而&#xff0c;这种方式…

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…

惠州市政数局局长杨伟斌:惠州市公共数据授权运营模式探索

近期&#xff0c;2024数字资产管理大会召开。会上&#xff0c;惠州市政务服务和数据管理局局长杨伟斌在会上做了题为基于“隐私计算区块链”的惠州市公共数据授权运营模式探索主旨演讲&#xff0c;从三个方面展开&#xff0c;一是建制度汇数据&#xff0c;二是夯基础保安全&…

查看 GitHub 仓库的创建时间

查看 GitHub 仓库的创建时间 1. https://api.github.com/repos/{owner}/{repository}2. curl -s https://api.github.com/repos/{owner}/{repository} | jq .created_atReferences 1. https://api.github.com/repos/{owner}/{repository} REST API endpoints for repositories…

ArcGIS中怎么进行水文分析?(思路介绍)

最近有人咨询&#xff0c;ArcGIS中怎么进行水文分析&#xff0c;大致的说一下河网提取的思路哈 解决思路&#xff1a;dem填洼→计算水流方向→计算水流累积矩阵→形成河网 dem填洼 计算水流方向 计算水流累积矩阵 用栅格计算器&#xff0c;设阈值&#xff08;自己多次尝试&…

自动化测试-Pytest测试

目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest‌是一个非常流行的Python测试框架&#xff0c;它支持简单的单元测试和复杂的功能测试&#xff0c;具有易于上手、功…

从0入门自主空中机器人-3-【环境与常用软件安装】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

2、redis的持久化

redis的持久化 在redist当中&#xff0c;高可用的技术包括持久化&#xff0c;主从复制&#xff0c;哨兵模式&#xff0c;集群。 持久化是最简单的高可用的方法&#xff0c;作用就是备份数据。即将数据保存到硬盘&#xff0c;防止进程退出导致数据丢失。 redis持久化方式&…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

深入解析:谱分解、SVD与PCA在算法中的应用与实现

特征值分解&#xff08;EVD&#xff09;、奇异值分解&#xff08;SVD&#xff09;和主成分分析&#xff08;PCA&#xff09;是矩阵分解技术的三种重要形式&#xff0c;它们在人工智能中扮演了关键角色。随着数据维度的快速增长和信息复杂度的提升&#xff0c;这些技术为处理高维…