gpt4 book ai didi

android - Realm 将项目添加到添加到 RealmObject 的 RealmList

转载 作者:搜寻专家 更新时间:2023-11-01 09:36:50 25 4
gpt4 key购买 nike

我需要像这样解决将数据放入 Realm 数据库的问题:

我有一个名为 obtained_code 的对象;我在一个名为 Offer 的对象中有一个已获取代码的 Realm 列表;我分别下载获得的代码,并通过它们的报价 ID 将它们分配给每个对象的列表。问题是我无法添加它们,因为当我检查尺寸时,它始终为 0。

代码如下:

ObtainedCodes codes = response.body();
for (ObtainedCode c : codes.getObtainedCodes()) {
Offer offer = RealmController.with(SplashActivity.this).getOffer(c.getOffer_id());
if (offer != null) {
Log.d("Size", "Offer not null");
realm1.beginTransaction();
RealmList<ObtainedCode> list = offer.getObtained_codes();
if (!list) { // if the 'list' is managed, all items in it is also managed
RealmList<ObtainedCode> managedImageList = new RealmList<>();
for (ObtainedCode item : list) {
if (item) {
managedImageList.add(item);
} else {
managedImageList.add(realm1.copyToRealm(item));
}
}
list = managedImageList;
}

offer.setObtained_codes(obtainedCodes);
Log.d("Size", String.valueOf(offer.getObtained_codes().size()));
realm1.copyToRealmOrUpdate(offer);
realm1.commitTransaction();
}
offer = RealmController.with(SplashActivity.this).getOffer(c.getOffer_id());
Log.d("Size", String.valueOf(offer.getObtained_codes().size()));
}

最佳答案

1.) InfoHive 上的 Ravi Tamada 教程一团糟,请参阅 my remake of that example instead .

如果您设法开始使用 0.82.1,因为 Ravi Tamada 声称 4 年前的版本是“稳定的”,那么我知道事实并非如此。请改用 1.2.0(或最新版本 3.4.1)

如果您看到 RealmController.with(),请运行,因为它忽略了线程限制。一旦您尝试从后台线程访问它,它就会崩溃。

在后台线程上,你需要做

@Override
public void run() {
try(Realm realm = Realm.getDefaultInstance()) {
repository.whatever(realm); // pass Realm instance to database methods
} // auto-close
// end of thread
}

2.) 你正在 UI 线程上执行写操作,这很糟糕,从 UI 线程你应该使用 realm.executeTransactionAsync(),但在你的情况下你实际上应该使用 Ęxecutors.newSingleThreadedPool() 在后台线程上执行 Retrofit 调用,并使用 call.execute() 而不是 call.enqueue()< 调用它.

3.) 你应该在后台线程上写入 Realm,在 UI 线程上你应该使用 RealmChangeListener 来监听写入。

4.) 您的代码不起作用,因为您将非托管列表设置为托管 RealmObject。

您应该修改 RealmObject 中现有的 RealmList,并仅向其添加托管对象。


Executor executor = Executors.newSingleThreadExecutor(); // field variable
// ...

void someMethod() {
executor.execute(new Runnable() {
@Override
public void run() {
Response<ObtainedCodes> response = retrofitService.getObtainedCodes().execute(); // run on current thread
ObtainedCodes codes = response.body();
if(codes == null) return;
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for(ObtainedCode obtainedCode : codes.getObtainedCodes()) {
Offer offer = realmRepository.getOffer(realm, obtainedCode.getOfferId());
if(offer == null) {
offer = realm.createObject(Offer.class, obtainedCode.getOfferId());
// map properties to offer if possible
}
RealmList<ObtainedCode> offerCodes = offer.getObtainedCodes();
ObtainedCode managedObtainedCode = realm.where(ObtainedCode.class).equalTo("obtainedCodeId", obtainedCode.getId()).findFirst();
if(managedObtainedCode == null) {
managedObtainedCode = realm.createObject(ObtainedCode.class, obtainedCode.getId());
// map properties from obtained code to managed obtained code
}
if(!offerCodes.contains(managedObtainedCode)) {
offerCodes.add(managedObtainedCode);
}
}
}
});
}
}
});
}

关于android - Realm 将项目添加到添加到 RealmObject 的 RealmList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447505/

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