Android SQLite 更新在 AsyncTask 中无法在后台运行

标签 android sqlite android-asynctask

我有一个有趣的问题。我有一个 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/

相关文章:

java - 从 SVG 绘制图形(图像)

c - 将一次性超时计时器与 sqlite 表中的一行关联

android - 如何在切换 fragment 时保持进度条状态?

android - 让外部类回调 AsyncTask 进行进度更新

java - 在android后台运行的倒数计时器

java - Android:如何获取此处指定格式的时区字符串

>4.1.2 中未调用 Android 相机更新回调

java - 更新安卓数据库

mysql - 通过查询搜索时包括父属性

mysql - SQL - 检查表中的元素是否有两个其他元素与它位于同一行