Room是Google提供的一个ORM库。
Room持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
=====================================================================
Entity,Dao,Database为Room的3大基本组件,不同组件之间的关系如图
Database:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点
使用方法:用@Database来注解类,且使用 @Database注释的类应满足以下条件
-
是扩展RoomDatabase的抽象类。
-
在注释中添加与数据库关联的实体列表。
-
包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。
在运行时,可以通过调用 Room.databaseBuilder()
或 Room.inMemoryDatabaseBuilder()
获取 Database
的实例。
Entity:表示数据库中的表
使用方法:用@Entit来注解实体类。
Dao:提供访问数据库的方法
使用方法:@Dao用来注解一个接口或者抽象方法。
==================================================================
Room作为JetPack架构组件中关于SQLite数据库的架构组件,对应有着自己的知识体系。下面通过记事本Demo对Room本身组件结合MVVM架构所涉及的知识体系做一个总结.
由于涉及到另外一些组件,在有使用到时会做简要介绍.
记事本Demo效果图:
1.1 编写数据库实体类
@Data
@Entity(tableName = “note”)
public class Note implements Serializable {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = “title”)
private String title;
@ColumnInfo(name = “content”)
private String content;
@ColumnInfo(name = “last_update_time”)
private Date lastUpdateTime;
}
1.2 编写数据库管理类Database
注意:因为实体类中存在复杂数据类型——时间类。所以在数据库管理中需要使用
@TypeConverters
注入转换类,对复杂类型进行统一的转换处理
@Database(entities = {Note.class},version = 1,exportSchema = false)
@TypeConverters({Converters.class})
public abstract class NoteDatabase extends RoomDatabase {
private static NoteDatabase INSTANCE;
public synchronized static NoteDatabase getINSTANCE(Context context) {
if (INSTANCE==null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),NoteDatabase.class,“note_datebase”)
.fallbackToDestructiveMigration()
.build();
}
return INSTANCE;
}
/**
- 在@Database中 多个entity则写多个Dao
*/
public abstract NoteDao getNoteDao();
}
1.3 编写数据库操作接口Dao
@Dao
public interface NoteDao {
@Insert
void insertNotes(Note… notes);
@Update
void updateNotes(Note… notes);
@Delete
void deleteNotes(Note… notes);
@Query(“delete from note”)
void deleteAllNotes();
@Query(“select * from note order by last_update_time desc”)
LiveData<List> queryAllNotes();
@Query(“select * from note where content like :pattern order by last_update_time desc”)
LiveData<List> queryNotesWithPattern(String pattern);
}
2.编写数据仓库(Repository、AsyncTask)
如果此处不引入Repository类会造成什么影响呢?为什么要引入Repository?
对数据库的操作(调用Dao)逻辑将放于ViewModel中(步骤5)。使得ViewModel中代码变得杂乱
引入仓库类,用于对数据库操作并对ViewModel暴露方法。让ViewModel专注于数据处理而非对数据库的调用,对ViewModel和Dao进一步解耦。