0

我有 2 节课:

public class DbFile extends RealmObject {
    @PrimaryKey
    private String fileId;
    // getters and setters
}

public class DbNews extends RealmObject {
    @PrimaryKey
    private long newsId;
    private RealmList<DbFile> photos;
    // getters and setters
}

当用户从服务器中提取数据时,如果不存在,我想创建一个新的 DbNews 实体,或者更新现有的实体。

public void addNews(ApiNews news) {
    Realm realm = Realm.getDefaultInstance();
    realm.executeTransaction(r -> {
        DbNews inDb = newsById(news.getId());

        if (inDb == null) {
            inDb = r.createObject(DbNews.class, news.getId());
        }

        inDb.setPhotos(FileListMerger.mergeWithRemote(r, inDb.getPhotos(), news.getPhotos()));

        r.copyToRealmOrUpdate(inDb);
    });
    realm.close();
}

这里mergeWithRemote的函数看起来像这样

public static RealmList<DbFile> mergeWithRemote(Realm realm, @NonNull RealmList<DbFile> local, @NonNull List<File> remote) {
    Set<String> remoteIds = new HashSet<>();
    for (File file : remote) {
        remoteIds.add(file.getId());
    }

    Set<String> localIds = new HashSet<>();
    for (DbFile file : local) {
        localIds.add(file.getFileId());
    }

    for (int i = 0; i < local.size(); i++) {
        if (!remoteIds.contains(local.get(i).getFileId())) {
            local.remove(i);
            i--;
        }
    }

    for (int i = 0; i < remote.size(); i++) {
        if (!localIds.contains(remote.get(i).getId())) {
            DbFile newPhoto = realm.where(DbFile.class).equalTo("fileId", remote.get(i).getId()).findFirst();
            if (newPhoto == null) {
                newPhoto = realm.createObject(DbFile.class, remote.get(i).getId());
            }
            local.add(newPhoto);
        }
    }

    return local;
}

从我的角度来看,这应该可以正常工作。但是当我通过 id 从领域获得新闻时,我得到的新闻没有照片(news.getPhotos().size() == 0)。

Realm realm = Realm.getDefaultInstance();
DbNews news = realm.where(DbNews.class)
                .equalTo("newsId", newsId).findFirst()
// somewhere later
realm.close();

注意:当我在 RealmBrowser 中打开数据库时,我看到文件保存在文件表中,新闻保存在新闻表中,但新闻包含空的文件列表。

4

0 回答 0