Room提供了一个覆盖SQLite的抽象层,以便在利用SQLite的全部功能的同时进行流畅的数据库访问。
处理非平凡数量的结构化数据的应用程序可以从本地持久保存数据中获益。 最常见的用例是缓存相关的数据。 这样,当设备无法访问网络时,用户仍然可以在离线时浏览该内容。 然后,在设备重新联机后,任何用户启动的内容更改都会同步到服务器。
由于Room会为您解决这些问题,因此我们强烈建议您使用Room而不是SQLite。 但是,如果您希望直接使用SQLite API,请阅读使用SQLite保存数据。
Room有3个主要部分:
- Database:包含数据库持有者,并作为应用程序持久关系数据的基础连接的主要访问点。
使用@Database
注释的类应满足以下条件:
- 是一个扩展RoomDatabase的抽象类。
- 在注释中包括与数据库关联的实体列表。
- 包含一个具有0个参数的抽象方法,并返回使用
@Dao
注释的类。
在运行时,您可以通过调用Room.databaseBuilder()
或Room.inMemoryDatabaseBuilder()
来获取Database实例。
- Entity:表示数据库中的表。
- DAO:包含用于访问数据库的方法。
这些组件以及它们与应用程序其余部分的关系如图1所示:
![](https://img.haomeiwen.com/i2157950/4bd366fed25adbdc.png)
以下代码段包含具有一个实体和一个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();
}
创建上述文件后,您将使用以下代码获取已创建数据库的实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
注意:在实例化AppDatabase对象时应遵循单例设计模式,因为每个RoomDatabase实例都相当昂贵,并且您很少需要访问多个实例。
网友评论