学习Room时使用的AsyncTask、Dao、Database、Entity详解

1.AsyncTask抽象类

功能

AsyncTask 属于安卓中实现多线程的一种方法,可以在该线程中实施耗时方法,比如数据库查询。也可以实现工作线程和主线程之间的通信。

类别:

属于抽象(abstract)类,使用时需extends。

参数:

含有三个泛型参数:

public abstract class AsyncTask { ... }

// 类中参数为3种泛型类型

// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型

// 具体说明:

// a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数

// b. Progress:异步任务执行过程中,返回下载进度值的类型

// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致

// 注:

// a. 使用时并不是所有类型都被使用

// b. 若无被使用,可用java.lang.Void类型代替

// c. 若有不同业务,需额外再写1个AsyncTask的子类}


学习Room时使用的AsyncTask、Dao、Database、Entity详解_第1张图片
核心方法


学习Room时使用的AsyncTask、Dao、Database、Entity详解_第2张图片
使用顺序

2.Dao

interactions 交互   compile 编译

以下是官网的描述:

Marks the class as a Data Access Object.

Data Access Objects are the main classes where you define your database interactions. They can include a variety of query methods.

数据接入对象是一个你定义你与你的数据库交互的主类,他们中有各种各样的查询方法。

The class marked with @Dao should either be an interface or an abstract class. At compile time, Room will generate an implementation of this class when it is referenced by a Database.

这个类应当被@Dao标记,并且应该是一个接口或者抽象类。在编译的时候,Room会产生该类的实现,当它被数据库引用的时候。

An abstract @Dao class can optionally have a constructor that takes a Database as its only parameter.

一个@Dao的抽象类能选择性的有一个把数据库当作其唯一参数的构造方法。

It is recommended to have multiple Dao classes in your codebase depending on the tables they touch.

根据他们关联的表格,建议在你的代码库中有个复合的Dao类。

查询操作很重要,可以结合SQL语句实现非常有针对性的查询:

学习Room时使用的AsyncTask、Dao、Database、Entity详解_第3张图片

3.Database

alter 更改;修改   mandatory 强制的

Marks a class as a RoomDatabase.

标记为RoomDatabase类

The class should be an abstract class and extend RoomDatabase.

这个类应该为一个继承RoomDatabase的抽象类

You can receive an implementation of the class via Room.databaseBuilder or Room.inMemoryDatabaseBuilder.

你能通过Room.databaseBuilder or Room.inMemoryDatabaseBuilder.这两种方式接受到一个本类的实现。

// Song and Album are classes annotated with @Entity.

@Database(version = 1, entities = {Song.class, Album.class})

abstract class MusicDatabase extends RoomDatabase {

// SongDao is a class annotated with @Dao.

abstract public SongDao getSongDao();

// AlbumDao is a class annotated with @Dao.

abstract public ArtistDao getArtistDao();

// SongAlbumDao is a class annotated with @Dao.

abstract public SongAlbumDao getSongAlbumDao(); }

The example above defines a class that has 2 tables and 3 DAO classes that are used to access it. 

在上面的引用中,定义了一个数据库类,其中有2个表格和3个Dao类去接入它。

There is no limit on the number of Entity or Dao classes but they must be unique within the Database.

实体和Dao在数据库中的数目是没有限制的,但是他们在这个数据库中必须是唯一的。

Instead of running queries on the database directly, you are highly recommended to create Dao classes. Using Dao classes will allow you to abstract the database communication in a more logical layer which will be much easier to mock in tests (compared to running direct SQL queries). It also automatically does the conversion from Cursor to your application data classes so you don't need to deal with lower level database APIs for most of your data access.

上面这段话的大概意思是,除非你直接对数据库使用查询操作,否则,强烈建议你在数据库类中创建一个Dao类,这能大幅度提升你的效率,从而避免了直接去使用复杂的操作数据库的语言。

Room also verifies all of your queries in Dao classes while the application is being compiled so that if there is a problem in one of the queries, you will be notified instantly.

Room在应用编译的时候会在Dao中核验你所有的查询操作,这样,一旦有问题出现,你能够马上察觉到。

其参数,即@Database后面括号呢的参数:

entities、version、exportSchema、views

4.Entiy


学习Room时使用的AsyncTask、Dao、Database、Entity详解_第4张图片

重点:

1、一个Entity对象代表数据表中的一行,一个Entity类代表一张数据表。

2、Entity中的成员变量都是数据表中的列。

3、一个Java类定义成Entity只要加上Entity注解就可以了。

主键Primary Key:每一个Entity至少定义一个主键(primary key),哪怕Entity中只有一个变量也要将这个变量定义为主键,在Room数据库中使用注解 @PrimaryKey 来定义主键,@PrimaryKey 的使用方式有两种一种是在类变量前面加,如果主键比较复杂可以加在@Entity注解的后面。

列名:和改变表名称tableName一样,可以改变表中的列名称,使用 @ColumnInfo来改变列的名称。如果不改的话默认使用变量名的小写形式。(注意:前面说了,Entity类中所有的变量都是数据表中的列。

使某些变量不生成数据表中的字段:由上面可知当一个类前加了Entity注解后类中的所有成员变量都会生成表中的属性列,如果我们不希望某个变量生成表中的属性列,可以使用注解 @Ignore。


学习Room时使用的AsyncTask、Dao、Database、Entity详解_第5张图片
ingnore

嵌套Entity:

如果定义的Entity类里面有个实体对象,并且希望定义的Entity中的表列字段包含该Entity类对象中的变量,可以在Entity类对象中加@Embedded标注。

这样就可以实现实体之间的组合。


学习Room时使用的AsyncTask、Dao、Database、Entity详解_第6张图片
@Embedded



学习Room时使用的AsyncTask、Dao、Database、Entity详解_第7张图片
app使用

application从RoomDatabase中获取DAO实例,并且通过DAO中定义的方法来操作数据库中Entity。获取设置entity的数据。

你可能感兴趣的:(学习Room时使用的AsyncTask、Dao、Database、Entity详解)