Android SQLite Update在AsyncTask中无法在后台运行

时间:2017-01-17 17:34:51

标签: android sqlite android-asynctask

我有一个有趣的问题。我有一个SQLite更新,我在Android上的AsyncTask中执行(因为在进行数据库调用之前我也不得不做大量的远程调用)。除非将应用程序推送到后台(例如,使用“主页”按钮),否则代码就像魅力一样。该任务继续在后台成功运行,进行数据库调用并返回1行已更改,但数据实际上从未实际进入数据库。没有错误或例外。更奇怪的是,日志显示一切正常 - 没有例外,nada。 再次,当没有推到后台时,这很好。

电话:

    result = (sqlDB.update("FormInstance", values, "InstanceId=?",  new String[] { String.valueOf(form.getSubmissionId()) }) > 0);

此调用也不涉及任何交易(除非它发生在Android SQLite代码的引擎盖下)。

任何人都知道为什么会出现这种情况?在推送到后台时,我不知道DB连接或SQLLite会发生什么事情?

更新

我尝试使用begintransaction / endtrans包装数据库调用但没有任何成功:

    sqlDB.beginTransaction();
    try {
        result = (sqlDB.update("FormInstance", values, "InstanceId=?",  new String[] { String.valueOf(form.getSubmissionId()) }) > 0);
    }
    finally {
        sqlDB.endTransaction();
    }

仍然表现得很成功但数据从未提交过。请注意我从设备中取出数据库并确认它尚未更新。

1 个答案:

答案 0 :(得分:0)

经过大量测试后,我发现虽然偶尔有一个onPause方法更新数据,但真正的问题是SQLLite更新在执行更新时并没有真正更新一个列(FormStatus)。这只是在后台运行时的情况。我通过在更新后立即查询结果来验证这一点。最终的解决方案是二次更新,只更新了FormStatus列,它确实有效。用begintrans / endtrans包装并没有帮助。