- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要像这样解决将数据放入 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/
我遇到了 Realm 问题,每次我尝试在存储 RealmObject 后将其设置为另一个 RealmObject 时,都会导致它崩溃并出现 NullPointerException。 例如。
我想从它的 Realm 中“分离”一个 RealmObject,这意味着我希望能够从一个方法中返回一个 RealmObject并能够在我关闭 Realm 实例后使用它。 像这样: public Per
直接上代码。我们有两个类: class Rocket extends RealmObject { @PrimaryKey private long id; private String name
写入 Realm : Realm realm = Realm.getInstance(mContext); realm.beginTransaction(); InfoCocktail content
考虑以下 RealmObject 子类 public class TimeSlot extends RealmObject { @PrimaryKey private int value = 0;
假设我的 Realm 数据库中有三个对象/元素:- 一个 B C 当我使用方法deleteFromRealm() 删除第一个元素(即 A)时,剩余两个对象的位置会像这样改变:- C B 而不是:- B
我有一个 RealmObject User 存储在一个单例中并在整个应用程序中访问——它是在 UI 线程上检索的。该对象表示已登录的用户,与 Item 类具有一对多关系。在事务中更改它时,例如: Re
我是 Realm 的新手,我想坚持以下模型: public class ChangeEntry { private int id; private long time; pri
我试图从官方文档的“通知”部分了解 Realm 中的通知类型,当我在多个托管对象中使用 RealmObject addChangeListener 时,只有一个对象发生变化时,所有这些通知类型都会被调
我的应用从 REST API 获取数据。 根据端点,我得到完整或部分 Account 的列表。 当 API 响应时,我调用 realm.copyToRealmOrUpdate(accounts)。 我
我在我的项目中做 Realm 数据库。当您使用 Realm 时,您需要将简单对象扩展为 RealmObject。我有一个问题:如何在不扩展 RealmObject 的情况下创建对象,但我也使用 Rea
我的 Android 应用程序中有一个配置类,我将其存储在 Realm 数据库中。我只是对其进行了编辑以遵循单例设计模式,因此只有一次配置实例。 问题是,该类现在有一个私有(private)构造函数,
为什么这段代码会触发 java.lang.IllegalArgumentException: RealmObject 无效,因此无法复制 错误? realm.beginTransaction(); r
documentation对于 realmObject.isValid() 说: isValid() Checks if the realmObject is still valid to use i
我在我的 android 应用程序中使用 Realm 作为数据模块,尽管我遇到了一些关于如何将自定义方法分配给 Realm 对象的问题。在 iOS 核心数据模块中,您有 NSObjects,它们保存到
在我的应用程序中,我有以下 RealmObjects: 产品 - 这作为主数据,不应修改。 购物车 - 购物车允许人们挑选要购买的东西。内容将是选择类型。 选择 - 表示用户选择的产品以及颜色、尺寸等
我在 Android 上使用 Realm,我有一个需要序列化为 JSON 的 RealmObject,我正在使用 GSON。模型看起来像: @RealmClass public class User
我是 Android 版 Realm 的新手,所以我不确定我是否以正确的方式处理这个问题。我有一个看起来像这样的类: public class Entry extends RealmObject im
我们有一个简单的类Person,它继承自 Realm Object。现在我们希望该子类符合 Equatable 协议(protocol)。非常简单的代码如下所示。 class Person: Obje
假设异步API调用返回Member Data,它是一个RealmObject,并且Member被保存到realm中。 public class Member extends RealmObject {
我是一名优秀的程序员,十分优秀!