从 Realm 中检索一个 RealmObject 后将其设置为另一个 RealmObject

Setting a RealmObject to another RealmObject after retrieving it from Realm

我在使用 Realm 时遇到问题,每次我尝试在存储 RealmObject 后将其设置为另一个时,Realm 都会崩溃并出现 NullPointerException。

例如

    Person person = new Person();
    person.setName("Martha");
    Realm realm = Realm.getInstance(this);
    realm.beginTransaction();
    realm.copyToRealm(person);
    realm.commitTransaction();

    Person personFromRealm = realm.where(Person.class).findFirst();

    realm.beginTransaction();
    Pet pet = new Pet();
    pet.setType("dog");
    personFromRealm.setPet(pet); <--- This line will crash
    realm.commitTransaction();

我不确定我还能做些什么来防止这种情况发生。 我需要这样做的原因是需要在一个地方创建 Person 对象,而我想在另一个地方添加动物。

我发现这个有效:

    Realm realm = Realm.getInstance(this);
    Person personFromRealm = realm.where(Person.class).findFirst();

    realm.beginTransaction();
    Pet pet = personFromRealm.getPet();
    pet.setType("dog");
    realm.commitTransaction();

这适用于简单的数据结构。但是我正在使用包含两个或三个其他 RealmObjects 的 Realm 对象并像这样操作它们似乎有很多不必要的工作。

我只想知道我是否遗漏了什么。或者,如果有更简单的方法可以做到这一点。任何帮助将不胜感激。

谢谢

Pet = new Pet() 将创建一个尚未由 Realm 管理的独立对象。这就是 personFromRealm.setPet(pet) 崩溃的原因。但是,这里的错误信息一点都不友好...

尝试:

Pet pet = new Pet();
pet.setType("dog");
pet = realm.copyToRealm(pet);
personFromRealm.setPet(pet);

或更简单:

Pet pet = realm.createObject(Pet.class);
pet.setType("dog");
personFromRealm.setPet(pet);

两者都需要在交易中。

https://github.com/realm/realm-java/issues/1558 是为了更好的异常消息而创建的。