Android 这两个领域的事务会相互干扰吗
我假设两个领域的事务不会相互干扰,因为这就是事务的目的,对吗?但考虑到我不是数据库/领域专家,我需要确认这一点,以便我可以尽快继续我的项目的其他部分 我正在为失败的HTTP请求制作后台加载程序。每个请求在域中都有一个类,该类的对象是该类型的失败请求。还有一个名为“RequestUploadStatus”的类,它有一个名为“needsUpload”的字段,该字段的对象维护给定请求类是否有需要上载的对象 e、 g 评论Android 这两个领域的事务会相互干扰吗,android,realm,Android,Realm,我假设两个领域的事务不会相互干扰,因为这就是事务的目的,对吗?但考虑到我不是数据库/领域专家,我需要确认这一点,以便我可以尽快继续我的项目的其他部分 我正在为失败的HTTP请求制作后台加载程序。每个请求在域中都有一个类,该类的对象是该类型的失败请求。还有一个名为“RequestUploadStatus”的类,它有一个名为“needsUpload”的字段,该字段的对象维护给定请求类是否有需要上载的对象 e、 g 评论 12,“你好” 45“漂亮的衬衫” 图像 没有 请求上传状态 [CommentC
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中立即可见。这有点棘手,但很有意义。好的,非常感谢。我做了一些测试我想我现在有足够的信心继续前进。很好的回答!!:)