使用此架构能带来什么好处?
UI和业务逻辑解耦。
有效避免生命周期组件内存泄漏。
提高模块可测试性。
提高应用稳定性,有效降低以下异常发生概率。
针对Jetpack架构中繁多的组件,下面我具体介绍一款数据库交互组件Room。其余组件在Demo中使用也会做相应说明
什么是Room?为什么要使用Room?
==============================================================================
Room是Google提供的一个ORM库。
Room持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
Room组件架构体系
=====================================================================
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.编写Room数据库
@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;
}
注意:因为实体类中存在复杂数据类型——时间类。所以在数据库管理中需要使用
@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;
}
/**
*/
public abstract NoteDao getNoteDao();
}
@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 queryAllNotes();
@Query(“select * from note where content like :pattern order by last_update_time desc”)
LiveData queryNotesWithPattern(String pattern);
}
2.编写数据仓库(Repository、AsyncTask)
对数据库的操作(调用Dao)逻辑将放于ViewModel中(步骤5)。使得ViewModel中代码变得杂乱
引入仓库类,用于对数据库操作并对ViewModel暴露方法。让ViewModel专注于数据处理而非对数据库的调用,对ViewModel和Dao进一步解耦。
一个Android
已封装好的轻量级异步类,用于实现多线程、异步通信、消息传递
数据库的操作很重,一次读写操作花费 10~20ms 是很常见的,这样的耗时很容易造成界面的卡顿。所以通常情况下,条件允许情况下要避免在主线程中处理数据库。
public class NoteRepository {
private NoteDao noteD