在android异步任务中,所有代码是按顺序执行的,还是有一些优化?我问,因为我经历了一批奇怪的行为,批量的ContentProviderOperations在asynct任务中执行。我要求doInBackground方法,因为其他两个在ui线程上执行。
编辑:奇怪的行为如下:我有三个表,一个主键作为外键,另外两个表,另外两个表彼此独立。因此,当我想删除某些内容时,我首先删除独立表的行以删除第一个中的外键约束,因此我也可以从那里删除它。对于插入相反的方法,首先我在第一个表中创建行,以创建其他两个可以引用的主键,然后在另外两个中创建行。
所有这些都放在一批内容提供程序操作中,但是我得到一个约束失败的响应。
EDIT2:所有这一切都在单个线程中,在单个AsyncTask的doInBackground中,这里是代码(问题是与其他两个有fk的那个:
for (ActionSyncModel ac : res.actions_table) {
Uri deleteUri = ActionContract.Action.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(ac.oldId)).build();
String temp = deleteUri.toString();
Log.i("action delete ->>>> ", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
for (JournalAttachmentSyncModel js : res.attach_table) {
Uri deleteUri = JournalAttachmentContract.JournalAttachment.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(js.oldId)).build();
String temp = deleteUri.toString();
Log.i("attach delete ->>>>", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
for (ProblemSyncModel pro : res.problems_table) {
Uri deleteUri = ProblemContract.Problem.CONTENT_URI
.buildUpon()
.appendPath(Integer.toString(pro.oldId))
.build();
String temp = deleteUri.toString();
Log.i("problem delete->>>>", temp);
batch.add(ContentProviderOperation.newDelete(deleteUri)
.build());
getContentResolver().delete(deleteUri, null, null);
}
谢谢
答案 0 :(得分:0)
从上面的代码中,似乎批处理操作最终没有执行。你需要getContentResolver()。applyBatch(...)来在浴室中运行它。否则,所有删除都将在单个事务中独立执行,而不是单个事务。
但它可能不一定解释约束错误。它可能对模式有所帮助。