Realm将项添加到添加到RealmObject的RealmList

时间:2017-02-24 20:15:41

标签: android list realm

我需要解决将数据放入领域数据库的问题:

我有一个名为obtain_code的对象; 我在一个名为Offer的对象中有一个获取代码的真实组合; 我分别下载获得的代码,并通过他们的商品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 个答案:

答案 0 :(得分:2)

1。)关于InfoHive的Ravi Tamada教程是一个糟糕的混乱,请参考my remake of that example instead

如果你设法开始使用0.82.1,因为Ravi Tamada声称一个4岁的版本是稳定的#34;我知道它不是。请改用1.2.0(或最新版本为3.4.1)

如果你看到@Override public void run() { try(Realm realm = Realm.getDefaultInstance()) { repository.whatever(realm); // pass Realm instance to database methods } // auto-close // end of thread } ,请运行,因为它忽略了线程限制。当您尝试从后台线程访问它时,它会崩溃。

在后台主题上,您需要执行

realm.executeTransactionAsync()

2。)你正在UI线程上执行写操作,这是不好的,你应该使用Ęxecutors.newSingleThreadedPool()的UI线程,但在你的情况下,你应该实际执行Retrofit调用使用call.execute()的后台主题并使用call.enqueue()而不是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); } } } }); } } }); } 进行调用。

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

4。)您的代码无法正常工作,因为您正在将非托管列表设置为托管的RealmObject。

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

 import sys
 sys.getrecursionlimit()