Android Architecture Component Room持久化数据库(一)概要

版权声明:本文为博主原创文章,欢迎大家转载!

但是转载请标明出处: 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实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值