Android 这两个领域的事务会相互干扰吗

Android 这两个领域的事务会相互干扰吗,android,realm,Android,Realm,我假设两个领域的事务不会相互干扰,因为这就是事务的目的,对吗?但考虑到我不是数据库/领域专家,我需要确认这一点,以便我可以尽快继续我的项目的其他部分 我正在为失败的HTTP请求制作后台加载程序。每个请求在域中都有一个类,该类的对象是该类型的失败请求。还有一个名为“RequestUploadStatus”的类,它有一个名为“needsUpload”的字段,该字段的对象维护给定请求类是否有需要上载的对象 e、 g 评论 12,“你好” 45“漂亮的衬衫” 图像 没有 请求上传状态 [CommentC

我假设两个领域的事务不会相互干扰,因为这就是事务的目的,对吗?但考虑到我不是数据库/领域专家,我需要确认这一点,以便我可以尽快继续我的项目的其他部分

我正在为失败的HTTP请求制作后台加载程序。每个请求在域中都有一个类,该类的对象是该类型的失败请求。还有一个名为“RequestUploadStatus”的类,它有一个名为“needsUpload”的字段,该字段的对象维护给定请求类是否有需要上载的对象

e、 g

评论
12,“你好”
45“漂亮的衬衫”

图像
没有

请求上传状态
[CommentClassId],正确
[ImageClassId]。假的

我不确定这是否是最好的方法,但现在让我们假设它是

因此,我想要避免的是(假设存在多个线程)其中一个请求类的RequestUploadStatus具有错误的“needsUpload”值,例如,当没有要上载的对象时为true,当有要上载的对象时为false。因此,更具体地给出以下代码:如果上传事务在RealmResults中循环,那么调度事务是否被阻止添加新对象进行上传并为该请求类设置“needsUpload”

安排交易

                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {

                            EntityUploadStatus entityUploadStatus = realm.where(EntityUploadStatus.class).equalTo("entityId", entityClassIdMap.entityId).findFirst();
                            entityUploadStatus.uploadNeeded = true;

                            //a comment or image or whatever
                            realm.insertOrUpdate(entity);

                        }
                    });
                          realmInstance.executeTransaction(new Realm.Transaction() {

                            @Override
                            public void execute(Realm realm) {

                                RealmResults<RealmObject> realmObjects = realmInstance.where(realmClass).findAll();

                                for(int i = 0; i < realmObjects.size(); i++) {

                                    RealmObject realmObject = realmObjects.get(i);

                                    Boolean success = uploadObject(realmObject, classToUpload.entityId);

                                    if(success)
                                    {

                                        realmObject.deleteFromRealm();

                                        if (i == realmObjects.size())
                                        {
                                            //last one successfully uploaded, set status to uploaded
                                            EntityUploadStatus entityUploadStatus = realm.where(EntityUploadStatus.class).equalTo("entityId", entityClassIdMap.entityId).findFirst();
                                            entityUploadStatus.uploadNeeded = false;

                                        }
                                    }
                                    else
                                        break;


                                }

                            }
                        });
上传交易

                    realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {

                            EntityUploadStatus entityUploadStatus = realm.where(EntityUploadStatus.class).equalTo("entityId", entityClassIdMap.entityId).findFirst();
                            entityUploadStatus.uploadNeeded = true;

                            //a comment or image or whatever
                            realm.insertOrUpdate(entity);

                        }
                    });
                          realmInstance.executeTransaction(new Realm.Transaction() {

                            @Override
                            public void execute(Realm realm) {

                                RealmResults<RealmObject> realmObjects = realmInstance.where(realmClass).findAll();

                                for(int i = 0; i < realmObjects.size(); i++) {

                                    RealmObject realmObject = realmObjects.get(i);

                                    Boolean success = uploadObject(realmObject, classToUpload.entityId);

                                    if(success)
                                    {

                                        realmObject.deleteFromRealm();

                                        if (i == realmObjects.size())
                                        {
                                            //last one successfully uploaded, set status to uploaded
                                            EntityUploadStatus entityUploadStatus = realm.where(EntityUploadStatus.class).equalTo("entityId", entityClassIdMap.entityId).findFirst();
                                            entityUploadStatus.uploadNeeded = false;

                                        }
                                    }
                                    else
                                        break;


                                }

                            }
                        });
realmInstance.executeTransaction(新Realm.Transaction(){
@凌驾
公共void执行(领域){
RealmResults realmObjects=realmInstance.where(realmClass.findAll();
对于(int i=0;i

代码没有经过测试,甚至可能不会编译,但我相信你会明白这一点。

这个答案适用于0.88.3以下和3.0.0以上的任何版本

您当前的提议有一个主要问题:

realmInstance.executeTransaction(new Realm.Transaction() {
  @Override
  public void execute(Realm realm) {
      RealmResults<RealmObject> realmObjects = realmInstance.where(realmClass).findAll();
      for(int i = 0; i < realmObjects.size(); i++) { // <-- !!!
          RealmObject realmObject = realmObjects.get(i);
          Boolean success = uploadObject(realmObject, classToUpload.entityId);
          if(success) {
              realmObject.deleteFromRealm(); // <-- !!!

RealmResults realmObjects=realmInstance.where(realmClass.findAll();
对于(int i=realmObjects.size()-1;i>=0;i--){//0.88.3及以下版本

RealmResults realmObjects=realmInstance.where(realmClass.findAll();

OrderedRealmCollection snapshot=realmObjects.createSnapshot();//此答案适用于0.88.3以下和3.0.0以上的任何版本

您当前的提议有一个主要问题:

realmInstance.executeTransaction(new Realm.Transaction() {
  @Override
  public void execute(Realm realm) {
      RealmResults<RealmObject> realmObjects = realmInstance.where(realmClass).findAll();
      for(int i = 0; i < realmObjects.size(); i++) { // <-- !!!
          RealmObject realmObject = realmObjects.get(i);
          Boolean success = uploadObject(realmObject, classToUpload.entityId);
          if(success) {
              realmObject.deleteFromRealm(); // <-- !!!

RealmResults realmObjects=realmInstance.where(realmClass.findAll();
对于(int i=realmObjects.size()-1;i>=0;i--){//0.88.3及以下版本

RealmResults realmObjects=realmInstance.where(realmClass.findAll();

OrderedRealmCollection snapshot=realmObjects.createSnapshot();//我们谈论的领域是什么版本?我的答案取决于它。我使用的是3.7.2我们谈论的领域是什么版本?我的答案取决于它。我使用的是3.7.2OK,有趣。createSnapshot()看起来它对我有用。它不需要是活动的。什么是“写”事务?还有其他类型的事务吗?我发布的“写”事务中的两个事务都是“写”事务吗,即使它们中都有读取?好的,从技术上讲是
realm.beginTransaction()
(+commit/cancel)和
realm.executeTransaction()
(根据需要调用begin/commit/cancel)都是写事务。如果你做一个简单的循环,那么你需要创建快照,否则你会跳过元素。在写事务中,你总是读取可能的最新数据。在事务中,每一个更改都会在RealmResults中立即可见。这有点棘手,但很有意义。好的,非常感谢。我做了一些测试我想我现在有足够的信心继续。回答得很好!!:)好的,很有趣。createSnapshot()看起来它对我有用。它不需要是活动的。什么是“写”事务?还有其他类型的事务吗?我发布的“写”事务中的两个事务都是“写”事务吗,即使它们中都有读取?好的,从技术上讲是
realm.beginTransaction()
(+commit/cancel)和
realm.executeTransaction()
(根据需要调用begin/commit/cancel)都是写事务。如果你做一个简单的循环,那么你需要创建快照,否则你会跳过元素。在写事务中,你总是读取可能的最新数据。在事务中,每一个更改都会在RealmResults中立即可见。这有点棘手,但很有意义。好的,非常感谢。我做了一些测试我想我现在有足够的信心继续前进。很好的回答!!:)