我有 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 中打开数据库时,我看到文件保存在文件表中,新闻保存在新闻表中,但新闻包含空的文件列表。