【发布时间】:2017-10-27 02:06:42
【问题描述】:
我假设两个 Realm 事务不会相互干扰,因为这就是事务的用途吗?但鉴于我不是数据库/领域专家,我需要对此进行确认,以便我可以尽快继续我项目的其他部分。
我正在为失败的 HTTP 请求制作后台上传程序。每个请求在 Realm 中都有一个类,其对象是该类型的失败请求。还有一个名为“RequestUploadStatus”的类,它有一个名为“needsUpload”的字段,其对象维护给定请求类是否有需要上传的对象。
例如
评论
12、《你好》
45,“漂亮的衬衫”
图片
无
请求上传状态
[CommentClassId],真
[图像类 ID]。假的
我不确定这是否是最好的方法,但现在让我们假设它是。
所以,我想要避免的(假设有多个线程)是请求类之一的 RequestUploadStatus 具有错误的“needsUpload”值,例如如果没有要上传的对象,则为 true;如果有要上传的对象,则为 false。所以更具体地说,给出以下代码:如果 upload 事务正在循环通过 RealmResults 是 schedule 事务被阻止添加新对象以上传并为此设置“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?我的答案取决于它。
-
我使用的是 3.7.2