在 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 實例。
Article Comments