java.lang.IllegalArgumentException : 'value' belongs to a different Realm

标签 java android realm

我正在尝试创建一个 Realm 对象,但出现了“java.lang.IllegalArgumentException: 'value'属于不同的 Realm。”异常。

我正在使用我在 OnCreateView 的 Fragment 中启动的 Realm.getDefaultInstance()。

我尝试保存到数据库中的对象使用其他 RealmObject 作为参数。

代码如下:

@Override
public boolean onQueryTextSubmit(final String query) {
    final ProductList productList = 
        realm.where(ProductList.class).equalTo("name", listName)
        .findFirst();
    ListEntry.create(realm, listId, productToAdd);
}

ListEntry.create 看起来像这样 -

public static void create(Realm realm,
                          final long listId,
                          final Product product,) {
realm.executeTransactionAsync(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Parent parent = realm.where(Parent.class).findFirst();
        RealmList<ListEntry> entries = parent.getListEntries();
        ListEntry listEntry = realm.createObject(ListEntry.class, decrement());
        listEntry.setListId(listId);
        listEntry.setProduct(product);
        entries.add(listEntry);)
}

Parent.class 是一个抽象,我用它来存储列表中所有已保存条目的列表,就像在 Realm android 的适配器示例 ( https://github.com/realm/realm-android-adapters/blob/master/example/src/main/java/io/realm/examples/adapters/model/Parent.java ) 中所做的那样。

每当我尝试在 onQueryTextSubmit 保存条目时,它都会返回错误,而不是保存任何内容。

这个错误消息在谷歌上是极其无法搜索到的——因此我请求你的帮助。

任何意见都将不胜感激!

最佳答案

当我为 SO 编写问题时,我找到了解决方案 - 我没有将 RealmObject 作为参数传递,而是将对象的 id 放在那里,并在事务期间将对象添加到对象内的私有(private) RealmList 中。

所以,而不是 -

ListEntry.class:
@PrimaryKey
private long entryId; 
private Product product;

我写的

@PrimaryKey
private long entryId; 
private RealmList<Product> productArray;

以及交易内部 -

Product product = realm.where(Product.class).equalTo("productId", productId).findFirst();
listEntry.getProductArray().add(product);

现在一切正常了。最好的零拷贝设计。

将其保留在这里,以供那些不幸通过 Google 搜索的人使用。

关于java.lang.IllegalArgumentException : 'value' belongs to a different Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932498/

相关文章:

android - 如何下载 Instagram 页面的 HTML 源代码

android - 连接重置后 Realm PermissionManager.getPermissions() 错误

node.js - 无法在我的 ReactNative 应用程序上安装 Realm;与 : npm ERR! 在 Realm @3.6.0 安装脚本失败 'node-pre-gyp install --fallback-to-build'

Android 首选项如何使用 switch 语句

java - 如何在Java中捕获Enter键并将事件更改为Tab

java - 进度条适用于 Android API 23,但不适用于 21 或 22

java - 乘以两位小数 - Java

android - 适用于iOS和Android的移动视觉API

android - 未找到默认的 RealmConfiguration。先调用 setDefaultConfiguration()

java - 使用 JODA 进行日期格式化 - AM 格式错误