Android Tech And Thoughts.

Android Native DataBase

Word count: 622Reading time: 2 min
2020/01/06 Share

imagem_blog-e1512640321599.png

使用Room将数据保存到本地数据库

Room时Google官方提供的数据库ORM(Object Relational Mapping)框架,使用起来非常方便。Room在SQLite上提供了一个抽象层,以便利用SQLite的全部功能的同时能更加流畅地访问数据库。

处理大量结构化数据的应用可极大地受益于在本地保留的这些数据,最常见的用例是缓存相关数据,这样当设备无法访问网络时,用户仍然可以在离线状态下浏览相应内容。设备之后重新链接到网络后,用户发起的所有内容更改都会同步到服务器。

注意,在Android中使用Room,请在应用的 build.gradle 文件中声明 Room 依赖项。

Room 主要包含3个主要组件:

  • 数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点
  • Entity :表示数据库中的表
  • DAO:包含用于访问数据库的方法

Room不同组件之间的关系
Room-structor

以下代码包含一个实体和一个DAO的示例数据库配置

User.java

1
@Entity
2
public class User {
3
    @PrimaryKey
4
    public int uid;
5
6
    @ColumnInfo(name = "first_name")
7
    public String firstName;
8
9
    @ColumnInfo(name = "last_name")
10
    public String lastName;
11
}

UserDAO.java

1
@Dao
2
public interface UserDao {
3
    @Query("SELECT * FROM user")
4
    List<User> getAll();
5
6
    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
7
    List<User> loadAllByIds(int[] userIds);
8
9
    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
10
            "last_name LIKE :last LIMIT 1")
11
    User findByName(String first, String last);
12
13
    @Insert
14
    void insertAll(User... users);
15
16
    @Delete
17
    void delete(User user);
18
}

AppDataBase.java

1
@Database(entities = {User.class}, version = 1)
2
public abstract class AppDatabase extends RoomDatabase {
3
    public abstract UserDao userDao();
4
}

在程序中使用

1
AppdataBase db = Room.databaseBuilder(appContext,AppDatabase.class,"database-name").build();

注意:

注意:如果您的应用在单个进程中运行,则在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例的成本相当高,而您几乎不需要在单个进程中访问多个实例。

如果您的应用在多个进程中运行,请在数据库构建器调用中包含 enableMultiInstanceInvalidation()。这样,如果您在每个进程中都有一个 AppDatabase 实例,就可以在一个进程中使共享数据库文件失效(类似于数据变脏了,通知其它实例?),并且这种失效会自动传播到其他进程中的 AppDatabase 实例。

Thanks

Room跨进程分析
Android官方组件介绍之Room

CATALOG
  1. 1. 使用Room将数据保存到本地数据库
  2. 2. Thanks