Android 架构组件学习之Room学习(一)

用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:包含一系列方法用来操作数据库.

这几个组件和他们的相互直接的关系如下图所示 :

[图片上传失败...(image-6946fe-1511413668138)]

图** 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 getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List 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

Android 架构组件学习之Room学习(一)_第1张图片
image

more detail will be coming soon.

你可能感兴趣的:(Android 架构组件学习之Room学习(一))