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

1.AsyncTask抽象类

功能

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

类别:

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

参数:

含有三个泛型参数:

public abstract class AsyncTask<Params, Progress, Result> { ... }

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

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

// 具体说明:

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

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

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

// 注:

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

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

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


核心方法


使用顺序

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语句实现非常有针对性的查询:

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


重点:

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

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

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

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

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

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


ingnore

嵌套Entity:

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

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


@Embedded



app使用

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容