当前位置: 首页 > news >正文

【Android】使用Room数据库解决本地持久化

【Android】使用Room数据库解决本地持久化

Room概述

Room 是一个持久性库,属于 Android Jetpack 的一部分。

Room 是 SQLite 数据库之上的一个抽象层。Room 并不直接使用 SQLite,而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作。此外,Room 还提供 SQLite 语句的编译时检查。

Room主要组件

Room 包含三个主要组件:

  • 数据实体表示应用的数据库中的表。数据实体用于更新表中的行所存储的数据以及创建新行供插入。
  • 数据访问对象 (DAO) 提供应用在数据库中检索、更新、插入和删除数据所用的方法。
  • 数据库类持有数据库,并且是应用数据库底层连接的主要访问点。数据库类为应用提供与该数据库关联的 DAO 的实例。

Room各组件之间协同工作图例

img

添加Room库

在build.gradle文件中添加依赖:

dependencies {//Roomdef room_version = "2.5.0"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"
}

版本号请查阅官方文档:

https://developer.android.google.cn/jetpack/androidx/releases/room?hl=zh_cn#groovy

创建Item 实体—Entity

实体类定义了一个表,每个实例都是表的某一行。用映射的方式,实体类告知Room数据库,它应如何呈现数据库中的信息并与之交互。

image-20240917201608505

@Entity 注解用于将某个类标记为数据库实体类。对于每个实体类,系统都会创建一个数据库表来保存相关项。存储在数据库中的每个实体实例必须有一个主键,用于唯一标识数据库表中的每个记录/条目。主键一旦赋值就不能修改,只要它还存在于数据库中,它就表示相应的实体对象。

在类之前加上 @Entity 注解来标识数据库的实体,编译时,系统便会根据这个类的设定来创建数据库。

@Entity()
public class Word{}

如果Entity()的参数为空,系统在创建数据库时,会把类名作为数据库的表名,如果要自定义表名,可以直接在Entity()里输入参数:

@Entity(tableName = "yourTableName")

接下来,我们应该添加:

  • 数据库的元素
  • 主键:每一个实体至少定义一个字段作为主键。可以将@PrimaryKey的autoGenerate属性设置为true来设置自动id。如果实体有一个复合的主键,可以使用 @Entity的primaryKeys属性来指定主键。

元素包括:

  • id
  • word
  • chineseMearning
@PrimaryKey(autoGenerate = true)
private  int id;
@ColumnInfo(name = "english_word")
private String word;
@ColumnInfo(name = "chinese_mearning")
private String chineseMeaning;

再加上几个get/set方法就定义完成了!

创建item 数据访问对象—Dao

新建一个MyDao对象的接口作为数据库操作的接口,在这个接口中,我们定义数据库的增删改查操作,在此之前,我们需要用 @Dao 来标记这个类为Dao类:

例如:

@Dao    //Database access object
public interface WordDao {@Insertvoid  insertWords(Word... words);@Updateint updateWords(Word... words);@Deletevoid deleteWords(Word...words);
}

如果我们要使用SQL语句,我们可以这么写:

@Dao    //Database access object
public interface WordDao {@Insertvoid  insertWords(Word... words);@Updateint updateWords(Word... words);@Deletevoid deleteWords(Word...words);@Query("DELETE FROM WORD")void deleteWords();@Query("SELECT * FROM WORD ORDER BY ID DESC")List<Word> getAllWords();
}

创建数据库实例—Database

我们将创建database类,通过继承改写room的database,把word.classwordDao.class联系在一起,组成一个完整的数据库。

在同一个位置新建一个WordDatabase的数据库,父类是androidx.room.RoomDatabase,为abstract类型。

我们通过@Database()来标记这个类为database类,在它的参数中我们可以定义:

  • entities:传入所有Entity的class对象;
  • version:数据库版本号。
  • exportSchema:设置是否导出数据库schema,默认为true,需要在build.gradle中设置:

当数据库发生改变时,数据库版本号会接着改变,以便更好的进行备份恢复,这里我们用不到,就随便设计一个值。

上面的Database()中,我们已经把Entity连接到了database中,在Dao类中,我们需要把wordDao类连接到数据库中,我们就需要实例化一个WordDao类:

@Database(entities = {Word.class},version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {public abstract WordDao getWordDao();
}

使用Room数据库

获取AppDatabase实例:

AppDatabase wordDatabase = Room.databaseBuilder(getApplicationContext(),AppDatabase.class, "user.db").build();

使用Room可以参考:

wordDao = wordDatabase.getWordDao();  // new a daoList<Word> list = wordDao.getAllWords();  //get all data from database with sql: select * from word

结语

参考:

Android数据库的使用:room - 知乎 (zhihu.com)


http://www.mrgr.cn/news/28924.html

相关文章:

  • 每日一题——第九十八题
  • 【 html+css 绚丽Loading 】000051 方寸轮回矩
  • java138-异常处理_java 138错误
  • 2022高教社杯全国大学生数学建模竞赛C题 问题二(1) Python代码
  • 2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码
  • linux 操作系统下的 declare 命令介绍和使用案例
  • 【零散技术】详解Odoo17邮件发送(一)
  • 【乐企】基础版本开票代码接口声明
  • 【Git】将本地项目上传到git | 在IDEA的提交记录中更改 提交的用户名
  • vue MVC设计模式与MVVM设计模式
  • 牛客周赛 Round 60(下)
  • C++:初始化列表
  • nginx服务器安装和部署代理
  • Weapons Armor PBR Pack 1 - Fantasy RPG 武器护甲游戏模型
  • 【3D打印】常用Gcode和相关示例
  • a,b,c中的最大值
  • 万字长文看懂Flink的架构及原理
  • PAT甲级-1055 The World‘s Richest
  • 关于STM32项目面试题01:电源篇
  • Vue2知识点