原文链接:https://developer.android.com/training/data-storage/room/?hl=zh-cn
文章非直译,因为之前直译过一次,回头单独去看发现不太连贯也不符合我们国人的思路。当然,可能是我翻译水平有限,但为了让翻译后的文章能更具可读性,决定在本人的理解上去翻译文章。下面就进入到本章的主题----Room。
Room基于SQLite提供了一层抽象层,使其不仅保留了原先SQLite的功能,并且使得访问数据库更加方便。
如果你的应用中有很多结构化的数据需要保存到本地,那么Room是非常适合在这种场景下使用的。最常见的例子就是需要缓存一些数据,这样的话当用户在没有网络的时候也能浏览数据,在恢复网络后可以把一些数据同步到服务端,这样就会拥有非常好的用户体验。
正因为Room已经为你提供那么强大的功能,所以我们强烈建议你使用Room,而不是SQLite。当然了,如果你依然更愿意直接通过SQLite的API来完成存储功能,可以读使用SQLite保存数据。
在Room中主要有如下三个组件:
- Database:是数据库的承载体,是操作数据的一个底层入口。
我们在创建该组件类的时候需要注解@Database,并且遵守以下条件:- 必须是一个继承于RoomDatabase的抽象类。
- 在注解中必须声明数据库中的实体类列表。
- 至少有一个没有参数的抽象方法,并且返回值必须是一个被@Dao注解的类。
在运行时,你可以通过方法Room.databaseBuilder或者Room.inMemoryDatabaseBuilder()来获取Database实例。
- Entity:代表了数据中的一张表。
- DAO:提供了访问数据库的方法。
这些组件和应用之间的关系如下图1
[站外图片上传中...(image-a7e845-1536134089866)]
下面的代码展示了如何定义Entity和DAO:
User.java
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// 为了简单起见省略了Getters和Setters方法,
// 但是他们是必须的.
}
UserDao.java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
在你创建完上面这些类之后,通过以下代码就能创建数据库:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
备注:在初始化AddDatabase对象时,最好使用单例模式,因为每创建一个RoomDatabase对象都是非常耗资源的,而且你很少有必要需要多个实例。
如果你现在就想要体验下Room,可以进入Android Room with a View 和Android Persistence。想看Room示例代码,见Android Components Smaples 。