在 Room 中有 3 個主要的元件

1.Database:

包含資料庫持有者(database holder),並作為應用程序的持久化數據基礎的主要訪問點。
使用 @Database 註釋的類別需要滿足以下條件:

  • 是一個抽象類別並繼承 RoomDatabase 類別
  • 在註釋加入與資料庫關聯的實體列表
  • 包含一個無參數的抽象方法,並返回使用 @Dao 註釋的類別

在程式運行時,可以通過呼叫 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder()來獲取 Database 實體。

2.Entity:

表示為資料庫中的資料表。

3.DAO:

包含用於訪問資料庫的方法。
應用程序使用 Room 資料庫來獲取與該資料庫關聯的數據訪問對像(DAO)。接著,應用程序使用每個 DAO 從資料庫中獲取 Entity,並將對這些 Entity 的任何更改保存回資料庫。最後,應用程序使用 Entity 來獲取和設置與資料庫的表列互相對應的值。
如下圖所示

以下的範例為包含一個 entity 和一個 dao 的資料庫
User.java

@Entity
public class User {
    @PrimaryKey
    public int uid;
    @ColumnInfo(name = "first_name")
    public String firstName;
    @ColumnInfo(name = "last_name")
    public String lastName;
}

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 即為上方第 1 點提到的 Database 並符合其 3 個條件,它是一個抽象類別並繼承 RoomDatabase,在註釋中加入使用的 Entity,提供無參數並返回 Dao 的抽象方法。
 
下面是建立並取得 database 的實體

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

 
注意:
如果應用程序在單進程(single process)中執行,則在實例化 AppDatabase 物件時應該套用 Singleton Pattern。因為建立 RoomDatabase 實例相當昂貴,很少需要在單進程中訪問多個實例。
如果應用程序在多進程中運行,請在數據庫構建器調用中包含 enableMultiInstanceInvalidation(),當在每個進程中都有一個 AppDatabase 實例時,可在一個進程中使共享數據庫文件無效,並且讓此無效自動傳播到其他進程中的 AppDatabase 實例。