前言:
在前面两章,我们学会了Room的基本概念和如何创建数据库,以及定义数据库的Entity,也即表。但光有表,还不够。我们还需要再借助Dao,来实现对表的操作。废话不多说,让我们先来看看Dao的基本简介。
一、什么是Dao,为什么要创建Dao?
在Room中,Dao是一组操作数据库表的行为的集合。它即可用接口的形式,也可用抽象类的形式来表现。换言之,创建一个Dao,即是创建一个接口或是一个抽象类。如果是以抽象类的形式,那这个Dao,可以携带一个RoomDataBase类型的参数,这个暂时没发现有什么用处。Anyway, 有了Dao我们就可以对数据库表进行操作了。
二、如何定义一个Dao。
千言万语,不如几行代码,你先粗略的看一下代码片段,我再一 一做解释。
@Dao
public interface UserDao {
@Query("select * from UserInfo")
List<UserInfo> getAll();
@Query("select * from UserInfo where id in (:userIds)")
List<UserInfo> loadAllByIds(int[] userIds);
@Query("select * from UserInfo where first_name like :first and "
+ "last_name like :last limit 1")
UserInfo findByName(String first, String last);
@Query("select id,first_name,last_name from UserInfo where id = :id")
UserInfo getUserInfoViaId(int id);
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insertAll(UserInfo... users);
@Update
void Update(UserInfo... users);
@Delete
void delete(UserInfo user);
}
定义一个Dao,只要注意这几点即可:
1、Dao必须是接口或是抽象类。
2、像定义Entity一样,在Dao的定义的前一行,加上注解@Dao即可。
3、Dao下的所有方法,都有一个注解。不同的注解,代表不同的意思,比如增删查改。而这些SQL语句是否合法,会在编译阶段就先过滤。如果你的SQL语句写错了,那将会编译失败。
三、在Dao中,使用Sql语句。
在这里,我不一 一的讲解增删查改的用法,因为在上文中的代码片段已经有举例了。在这里,我要讲的是一些在Dao中使用sql时,需要注意的东西。我们拿一条普通的查询语句来解释:
@Query("select * from UserInfo where id in (:userIds)")
List<UserInfo> loadAllByIds(int[] userIds);
如代码所示。 首先,from 后面的表名所代表的类,必须是一个Entity。然后,where 后面的条件字段,必须是该Entity里面的字段。最后,匹配的条件,必须与方法的参数名一致。
其它的详细使用,可以参考该博客:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0525/7971.html
好了,到此为止,我们已经学会了Room的基本用法和如何定义Entity和Dao。
需要Demo的同学,可以在github上,下载这个项目,里面包含了一系列新知识点的使用Demo,我会不断的更新该库:
https://github.com/SuperBeagleDog/OkMVP.git