美文网首页
数据库Room之概要(译)

数据库Room之概要(译)

作者: kingkingruan | 来源:发表于2018-09-05 15:58 被阅读0次

    原文链接: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 ViewAndroid Persistence。想看Room示例代码,见Android Components Smaples

    相关文章

      网友评论

          本文标题:数据库Room之概要(译)

          本文链接:https://www.haomeiwen.com/subject/kcvawftx.html