基本用法

設定例項

要使用 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();
    }
});