Realm(Java)數據庫使用文檔(RealmObjects)


Realm(Java)數據庫使用文檔(目錄)

4.1 自動更新對象

RealmObjects是實時的,可自動將視圖更新爲基礎數據。 您無需刷新對象。 對對象的更改會立即反映在查詢結果中。

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Dog myDog = realm.createObject(Dog.class);
        myDog.setName("Fido");
        myDog.setAge(1);
    }
});
Dog myDog = realm.where(Dog.class).equalTo("age", 1).findFirst();

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Dog myPuppy = realm.where(Dog.class).equalTo("age", 1).findFirst();
        myPuppy.setAge(2);
    }
});

myDog.getAge(); // => 2

這不僅使Realm保持快速高效,還使您的代碼更簡單,反應更靈敏。如果您的Activity或Fragment依賴於特定的RealmObjectRealmResults實例,則無需擔心在更新UI之前刷新或重新獲取它們。

您可以訂閱 Realm通知 以瞭解Realm數據何時更新。

4.2 自定義對象

幾乎可以像POJO一樣使用RealmObject。從RealmObject擴展您的類。您可以將這些字段設爲公共字段,並可以使用簡單的賦值來代替setter和getter。

public class Dog extends RealmObject {
    public String name;
    public int age;
}

您可以像其他任何類一樣使用Dog:您可以向getter和setter方法添加邏輯(例如,用於驗證),還可以添加所需的任何自定義方法。

要將Dog對象添加到Realm,請使用createObject或copyToRealm方法。

realm.executeTransaction(new Realm.Transaction() {
    @Overrride
    public void execute(Realm realm) {
        Dog dog = realm.createObject(Dog.class);
        dog.name = "Fido";
        dog.age  = 5;
    }
};

4.3 RealmModel 接口

您的類不需要繼承RealmObject,而通過實現RealmModel接口,添加@RealmClass註解即可:

@RealmClass
public class User implements RealmModel {

}

使用此接口,RealmObject上可用的所有方法都可以通過靜態方法使用。請注意,繼承RealmObject的類不需要@RealmClass註解或實現RealmModel

// 使用 RealmObject
user.isValid();
user.addChangeListener(listener);

// 使用 RealmModel
RealmObject.isValid(user);
RealmObject.addChangeListener(user, listener);

4.4 JSON

您可以添加一個映射到RealmObject的JSON對象到Realm。 JSON對象可以是String,JSONObjectInputStream。Realm將忽略RealmObject未定義的JSON中的任何屬性。 通過Realm.createObjectFromJson添加單個對象,並通過[Realm.createAllFromJson] [api/io/realm/Realm.html#createAllFromJson-java.lang.Class-java.lang.String-)添加對象列表。

// 代表城市的RealmObject
public class City extends RealmObject {
    private String city;
    private int id;
    // getters and setters left out ...
}

// 從字符串插入
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        realm.createObjectFromJson(City.class, "{ city: \"Copenhagen\", id: 1 }");
    }
});

// 使用InputStream插入多個items
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        try {
            InputStream is = new FileInputStream(new File("path_to_file"));
            realm.createAllFromJson(City.class, is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
});

如果JSON對象中的字段爲null,並且RealmModel需要該字段,則Realm將引發異常。如果該字段是可選的,則在創建對象時將其值設置爲默認字段,而在更新對象時將其值設置爲null。如果RealmModel的JSON對象中沒有字段,則該值在RealmModel中將保持不變。

4.5 適配器Adapters

Realm提供了抽象實用程序類,以幫助將來自OrderedRealmCollectionsRealmResultsRealmList都實現此接口)的數據綁定到標準UI小部件。

要使用適配器,請將依賴項添加到App級別build.gradle:

dependencies {
    compile 'io.realm:android-adapters:2.1.1'
}

可在此處找到適配器的文檔,並在此處找到使用它們的示例。

4.6 意圖Intents

由於RealmObjects沒有實現Parcelable,因此無法直接傳遞,因此您必須傳遞正在使用的對象的標識符。 例如,如果對象具有主鍵,則在Intent Extras捆綁包中傳遞主鍵值:

// 假設我們在'id'字段上有一個帶有主鍵的用戶類...
Intent intent = new Intent(getActivity(), ReceivingService.class);
intent.putExtra("person_id", person.getId());
getActivity().startService(intent);

從接收端的捆綁包(Activity,Service,IntentService,BroadcastReceiver等)中檢索主鍵值,然後打開一個Realm並查詢RealmObject:

// in onCreate(), onHandleIntent(), etc.
String personId = intent.getStringExtra("person_id");
Realm realm = Realm.getDefaultInstance();
try {
    Person person = realm.where(Person.class).equalTo("id", personId).findFirst();
    // do something with the person ...
} finally {
    realm.close();
}

在其他線程上重新打開Realm的開銷非常小。

您可以在線程示例的“對象傳遞”部分找到工作示例。該示例向您展示瞭如何在常見的Android用例中傳遞ID和檢索RealmObject。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章