版权声明:本文为博主原创文章,欢迎大家转载!
但是转载请标明出处: https://blog.csdn.net/t000818/article/details/84253457 ,本文出自:【唐宏宇的博客】
Room persistence库为SQLite提供了一个抽象层,以便在利用SQLite的全部功能的同时实现更强大的数据库访问。
应用程序可以从本地持久化数据中,处理比较重要的大批量的结构化数据。最常见的用例是缓存相关的数据。这样,当设备无法访问网络时,用户仍然可以在离线时浏览该内容。然后,在设备重新联网后,任何用户的内容更改都会同步到服务器。
由于Room会为我们解决这些问题,因此 强烈建议 使用 Room 替代 SQLite。
Room 有3个主要部分:
-
Database: 包含数据库持有者,并作为应用程序的持久关系数据的基础连接的主要访问点。
使用
@Database
注解的类应满足以下条件:- 必须是继承
RoomDatabase
的抽象类 - 在注释中包括与数据库关联的实体列表
- 包含一个没有参数的抽象方法,并返回一个带注解
@Dao
的类
在运行时,您可以通过调用
Room.databaseBuilder()
或Room.inMemoryDatabaseBuilder()
来获取数据库实例 - 必须是继承
-
Entity: 表示数据库中的表.
-
DAO: 包含用于访问数据库的方法
该应用程序使用Room数据库来获取与该数据库关联的数据访问对象或DAO。然后,应用程序使用每个DAO从数据库中获取实体,并将对这些实体的任何更改保存回数据库。最后,应用程序使用实体来获取和设置与数据库中的表列对应的值
Room的不同组件之间的这种关系如图1所示
图1.Room架构图
以下代码段包含具有一个实体和一个DAO的示例数据库配置
User类 Kotlin写法:
// Kotlin写法
@Entity
data class User(
@PrimaryKey var uid: Int,
@ColumnInfo(name = "first_name") var firstName: String?,
@ColumnInfo(name = "last_name") var lastName: String?
)
User类 Java写法:
// Java写法
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
UserDao类 Kotlin写法:
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
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 Kotlin写法:
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
AppDatabase Java写法:
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
创建上述文件后,使用以下代码获取已创建数据库的实例:
Kotlin写法:
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
Java写法:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
注意: 如果你的应用程序在单个进程中运行,则在实例化AppDatabase对象时应遵循单例设计模式。每个 RoomDatabase
RoomDatabase实例都相当昂贵,很少需要在单个进程中访问多个实例。
如果你的应用程序在多个进程中运行,请在数据库构建器调用中包含enableMultiInstanceInvalidation()。这样,当你在每个进程中都有一个AppDatabase实例时,可以在一个进程中使共享数据库文件无效,并且此无效自动传导到其他进程中的AppDatabase实例。