在本地端資料庫儲存資料 (Room)

在 Room 中有 3 個主要的元件

1.Database:


包含資料庫持有者(database holder),並作為應用程序的持久化數據基礎的主要訪問點。

使用 @Database 註釋的類別需要滿足以下條件:

  • 是一個抽象類別並繼承 RoomDatabase 類別

  • 在註釋加入與資料庫關聯的實體列表

  • 包含一個具有0個參數的抽象方法,並返回使用 @Dao 註釋的類別


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

2.Entity:


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

3.DAO:


包含用於訪問資料庫的方法。

應用程序使用 Room 資料庫來獲取與該資料庫關聯的數據訪問對像(DAO)。接著,應用程序使用每個 DAO 從資料庫中獲取實體,並將對這些實體的任何更改保存回資料庫。最後,應用程序使用實體來獲取和設置與資料庫中的表列對應的值。

如下圖所示


以下的範例為包含一個 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();
}

 

下面是建立並取得 database 的實體
AppDatabase db = Room.databaseBuilder(getApplicationContext(),  
AppDatabase.class, "database-name").build();

 

注意:

如果應用程序在單進程(single process)中執行,則在實例化 AppDatabase 物件時應該套用 Singleton Pattern。因為建立 RoomDatabase 實例相當昂貴,很少需要在單進程中訪問多個實例。

如果應用程序在多進程中運行,請在數據庫構建器調用中包含 enableMultiInstanceInvalidation(),當在每個進程中都有一個 AppDatabase 實例時,可在一個進程中使共享數據庫文件無效,並且讓此無效自動傳播到其他進程中的 AppDatabase 實例。

 

Orignal From: 在本地端資料庫儲存資料 (Room)

0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews