我有一个有趣的问题。我有一个 SQLite 更新,我正在 Android 上的 AsyncTask 中执行(因为在进行数据库调用之前我还必须进行大量远程调用)。除非应用程序被推送到后台(例如,使用主页按钮),否则代码就像一个魅力一样工作。该任务继续在后台成功工作,进行数据库调用并返回 1 行已更改,但数据从未真正进入数据库。没有错误或异常。更奇怪的是,日志显示一切正常 - 没有异常(exception),nada。 同样,当不被推送到后台时,它工作正常。
电话:
result = (sqlDB.update("FormInstance", values, "InstanceId=?", new String[] { String.valueOf(form.getSubmissionId()) }) > 0);
此外,此调用不涉及任何事务(除非它发生在 Android SQLite 代码的底层)。
有人知道为什么会这样吗?当推送到后台时,数据库连接或 SQLLite 是否发生了我不知道的事情?
更新
我尝试用 begintransaction/endtrans 包装数据库调用,但没有成功:
sqlDB.beginTransaction();
try {
result = (sqlDB.update("FormInstance", values, "InstanceId=?", new String[] { String.valueOf(form.getSubmissionId()) }) > 0);
}
finally {
sqlDB.endTransaction();
}
仍然表现得好像它是成功的,但数据从未提交。请注意,我从设备中提取了数据库并验证它没有更新。
最佳答案
经过多次测试,我发现虽然有一个onPause方法偶尔会更新数据,但真正的问题是SQLLite更新在执行更新时并没有真正更新一列(FormStatus)。只有在后台运行时才会出现这种情况。我在更新后立即通过查询结果验证了这一点。最终的解决方案是二次更新,只更新了 FormStatus 列,这确实有效。用 begintrans/endtrans 包装没有帮助。
关于Android SQLite 更新在 AsyncTask 中无法在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41703509/