基本用法
設定例項
要使用 Realm,首先需要獲取它的例項。每個 Realm 例項都對映到磁碟上的檔案。獲取例項的最基本方法如下:
// Create configuration
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(context).build();
// Obtain realm instance
Realm realm = Realm.getInstance(realmConfiguration);
// or
Realm.setDefaultConfiguration(realmConfiguration);
Realm realm = Realm.getDefaultInstance();
方法 Realm.getInstance()
建立資料庫檔案(如果尚未建立),否則開啟檔案。RealmConfiguration
物件控制如何建立領域的所有方面 - 無論是 inMemory()
資料庫,領域檔案的名稱,是否需要遷移需要遷移領域,初始資料等。
請注意,對 Realm.getInstance()
的呼叫是引用計數(每次呼叫增加一個計數器),並且當呼叫 realm.close()
時計數器會減少。
關閉例項
在後臺執行緒上,一旦不再使用 Realm 例項(例如,事務完成且執行緒執行結束) ,關閉它們非常重要。無法關閉後臺執行緒上的所有 Realm 例項會導致版本固定,並可能導致檔案大小的大幅增長。 ******
Runnable runnable = new Runnable() {
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
// ...
} finally {
if(realm != null) {
realm.close();
}
}
};
new Thread(runnable).start(); // background thread, like `doInBackground()` of AsyncTask
值得注意的是,在 API 級別 19 以上,你可以使用以下程式碼替換此程式碼:
try(Realm realm = Realm.getDefaultInstance()) {
// ...
}
楷模
下一步將是建立模型。這裡可能會問一個問題,“什麼是模型?”。模型是定義儲存在資料庫中的物件的屬性的結構。例如,在下面我們為一本書建模。
public class Book extends RealmObject {
// Primary key of this entity
@PrimaryKey
private long id;
private String title;
@Index // faster queries
private String author;
// Standard getters & setter
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
請注意,你的模型應該擴充套件 RealmObject 類。主鍵也由 @PrimaryKey
註釋指定。主鍵可以為 null,但只有一個元素可以將 null
作為主鍵。你還可以將 @Ignore
註釋用於不應該持久儲存到磁碟的欄位:
@Ignore
private String isbn;
插入或更新資料
為了將書籍物件儲存到 Realm 資料庫例項,你可以先建立模型的例項,然後通過 copyToRealm
方法將其儲存到資料庫中。要建立或更新,你可以使用 copyToRealmOrUpdate
。 (更快的替代方案是新新增的 insertOrUpdate()
)。
// Creating an instance of the model
Book book = new Book();
book.setId(1);
book.setTitle("Walking on air");
book.setAuthor("Taylor Swift")
// Store to the database
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(book);
}
});
請注意,對資料的所有更改都必須在事務中進行。建立物件的另一種方法是使用以下模式:
Book book = realm.createObject(Book.class, primaryKey);
...
查詢資料庫
-
所有書籍:
RealmResults<Book> results = realm.where(Book.class).findAll();
-
ID 大於 10 的所有書籍:
RealmResults<Book> results = realm.where(Book.class) .greaterThan("id", 10) .findAll();
-
'Taylor Swift'
或'%Peter%'
的書籍:RealmResults<Book> results = realm.where(Book.class) .beginGroup() .equalTo("author", "Taylor Swift") .or() .contains("author", "Peter") .endGroup().findAll();
刪除物件
例如,我們想要刪除 Taylor Swift 的所有書籍:
// Start of transaction
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// First Step: Query all Taylor Swift books
RealmResults<Book> results = ...
// Second Step: Delete elements in Realm
results.deleteAllFromRealm();
}
});