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。

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