用Room持久化库来保存数据
原文地址 https://developer.android.com/training/data-storage/room/index.html
Room提供了一个SqLite抽象层,在使用SqLite时我们可以流利的操作各种功能.
一般而言对处理大量数据的App而言,基本上都是选择保存到本地数据.最常见的场景是用来缓存相关的数据,这样,当设备无法上网时,用户依然可以离线浏览数据.当用户再次连接上线,任何用户操作相关的内容发生改变都会同步到服务器.
我们强烈建议你使用Room,因为Room已经为了你准备好了这些需求.当然退一步将,即便你更新换使用原生的use SQLite APIs 来处理数据库,Android依然会给你提供支持哒.
Room有3个主要组件
Database:包含了数据库本身和相关服务,用来保存APP的相关持久化数据.
以
@Database
注解形式开头的类,应完全遵守如下条件:-
作为一个抽象类并且继承自
RoomDatabase
在注解内罗列相关的实体类(示例代码如下)
@Database(entities = {User.class, Repo.class, Contributor.class, RepoSearchResult.class}, version = 3)
包含至少一个无参抽象方法,该方法返回以
@Dao
注解的相关类在运行时我们通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()方法 来创建 Database的实例
Entity:代表数据库中的一张表.
DAO:包含一系列方法用来操作数据库.
这几个组件和他们的相互直接的关系如下图所示 :
图* 1.*
Room 架构图解
下面的代码片段用一个实体类展(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 and setters are ignored for brevity,
// but they're required for Room to work.
}
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();
}
在创建了上述文件之后,你调用如下代码就可以得到一个database实例(是不是很神奇)
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
备注:
在初始化AppDatabase 应该采用单例模式
因为AppDatabase
实例使用成本很高,而且很少场景需要多个实例.下面是官方sample代码所示的单例模式.
public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = buildDatabase(context.getApplicationContext(), executors);
sInstance.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return sInstance;
}
好了到这里已经入门,你可以选择放弃了。。
附上demo 地址https://github.com/jelychow/RoomLearn-one
more detail will be coming soon.