Android JetPack架构——结合记事本Demo一篇打通对Sqlite的增删改查结合常用jetpack架构应用

在这里插入图片描述

使用此架构能带来什么好处?


  • UI和业务逻辑解耦。

  • 有效避免生命周期组件内存泄漏。

  • 提高模块可测试性。

  • 提高应用稳定性,有效降低以下异常发生概率。

针对Jetpack架构中繁多的组件,下面我具体介绍一款数据库交互组件Room。其余组件在Demo中使用也会做相应说明

什么是Room?为什么要使用Room?

==============================================================================

Room是Google提供的一个ORM库。

Room持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。

Room组件架构体系

=====================================================================

Entity,Dao,Database为Room的3大基本组件,不同组件之间的关系如图

Android架构组件(四):Room | Power

Database:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点

使用方法:用@Database来注解类,且使用 @Database注释的类应满足以下条件

  • 是扩展RoomDatabase的抽象类。

  • 在注释中添加与数据库关联的实体列表。

  • 包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。

在运行时,可以通过调用 Room.databaseBuilder()Room.inMemoryDatabaseBuilder() 获取 Database 的实例。

Entity:表示数据库中的表

使用方法:用@Entit来注解实体类。

Dao:提供访问数据库的方法

使用方法:@Dao用来注解一个接口或者抽象方法。

记事本应用讲解

==================================================================

Room作为JetPack架构组件中关于SQLite数据库的架构组件,对应有着自己的知识体系。下面通过记事本Demo对Room本身组件结合MVVM架构所涉及的知识体系做一个总结.

由于涉及到另外一些组件,在有使用到时会做简要介绍.

在这里插入图片描述

记事本Demo效果图:

在这里插入图片描述

1.编写Room数据库


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 queryAllNotes();

@Query(“select * from note where content like :pattern order by last_update_time desc”)

LiveData queryNotesWithPattern(String pattern);

}

2.编写数据仓库(Repository、AsyncTask)


如果此处不引入Repository类会造成什么影响呢?为什么要引入Repository?

对数据库的操作(调用Dao)逻辑将放于ViewModel中(步骤5)。使得ViewModel中代码变得杂乱

引入仓库类,用于对数据库操作并对ViewModel暴露方法。让ViewModel专注于数据处理而非对数据库的调用,对ViewModel和Dao进一步解耦。

什么是AsyncTask?为什么需要引入AsyncTask?

  1. 一个Android 已封装好的轻量级异步类,用于实现多线程、异步通信、消息传递

  2. 数据库的操作很重,一次读写操作花费 10~20ms 是很常见的,这样的耗时很容易造成界面的卡顿。所以通常情况下,条件允许情况下要避免在主线程中处理数据库。

public class NoteRepository {

private NoteDao noteD

你可能感兴趣的:(android,jetpack,架构,sqlite)