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依賴於特定的RealmObject
或RealmResults
實例,則無需擔心在更新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,JSONObject或InputStream。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提供了抽象實用程序類,以幫助將來自OrderedRealmCollections
(RealmResults
和RealmList
都實現此接口)的數據綁定到標準UI小部件。
- 將RealmBaseAdapter與
ListView
一起使用。看一個例子。 - 將RealmRecyclerViewAdapter與
RecyclerView
一起使用。看一個例子。
要使用適配器,請將依賴項添加到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。