gpt4 book ai didi

java - 如何使用 Realm 创建递归关系?

转载 作者:行者123 更新时间:2023-12-02 02:48:16 25 4
gpt4 key购买 nike

型号:

public class Dog extends RealmObject {
@PrimaryKey
public String id = UUID.randomUUID().toString();
... other random String attributes
public Dog mother;
}

Activity :

public class CustomActivity extends AppCompatActivity {
private Realm realm;
private Dog dog = new Dog();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
realm = Realm.getDefaultInstance();
}

@Override
public void onDestroy() {
super.onDestroy();
realm.close();
}

private void setMother(int id) {
dog.mother = realm.where(Dog.class).equalTo(ID, id).findFirst();
}

private void saveDog() {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(dog);
}
});
}

}

当我运行此代码时,它给了我这个错误:

属于其他线程中的 Realm 实例的对象无法复制到此 Realm 实例中。

我让它工作的唯一方法是使用realm.copyFromRealm(),但整个对象被复制,我不希望这样。

我是否应该单独保存母亲 ID,并在以后在应用程序中需要时查询母亲?

有没有办法在不复制整个对象的情况下实现我想要做的事情?

<小时/>

编辑:

我最初认为整个对象是使用realm.copyFromRealm()复制的,因为它在 Realm 浏览器中的外观。
我刚刚测试更新dog.mother 中的字段,它更新了链接的对象,这意味着它不是副本。
我仍然不知道这是否是实现我想要做的事情的最佳方法或正确方法,但它达到了我想要的效果。

最佳答案

  private Realm realm;    

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
realm = Realm.getDefaultInstance(); //<--- this is on ui thread
<小时/>
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(dog); // <-- this is on background thread
//...


private void setMother(int id) {
dog.mother = realm.where(Dog.class).equalTo(ID, id).findFirst(); // <-- uses UI-thread Realm stored as field
<小时/>

因此,如果您在后台线程上使用 setMother(),您将访问 UI 线程 Realm,并且会抛出 IllegalStateException。

您需要将给定线程的 Realm 传递给该方法。

  private void setMother(Realm realm, Dog dog, int id) {
dog.mother = realm.where(Dog.class).equalTo(ID, id).findFirst();
}

private void saveDog() {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Dog _dog = realm.copyToRealmOrUpdate(dog);
setMother(realm, _dog, id);
}
});

关于java - 如何使用 Realm 创建递归关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com