room概述
room 是一个持久性库,属于 android jetpack 的一部分。
room 是 sqlite 数据库之上的一个抽象层。room 并不直接使用 sqlite,而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作。此外,room 还提供 sqlite 语句的编译时检查。
room主要组件
room 包含三个主要组件:
- 数据实体表示应用的数据库中的表。数据实体用于更新表中的行所存储的数据以及创建新行供插入。
- 数据访问对象 (dao) 提供应用在数据库中检索、更新、插入和删除数据所用的方法。
- 数据库类持有数据库,并且是应用数据库底层连接的主要访问点。数据库类为应用提供与该数据库关联的 dao 的实例。
room各组件之间协同工作图例
添加room库
在build.gradle文件中添加依赖:
dependencies { //room def 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数据库,它应如何呈现数据库中的信息并与之交互。
@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.class
和worddao.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 dao list<word> list = worddao.getallwords(); //get all data from database with sql: select * from word
结语
以上就是android使用room数据库解决本地持久化的操作的详细内容,更多关于android room本地持久化的资料请关注代码网其它相关文章!
发表评论