2017-01-17 9 views
3

興味深い問題があります。私はAndroidでAsyncTask内で実行しているSQLiteのアップデートを持っています(DBコールを行う前にリモート呼び出しを行う必要があるため)。このコードは、アプリケーションがバックグラウンドにプッシュされない限り(例えば、「ホーム」ボタンを使用して)、魅力のように機能します。タスクはバックグラウンドで正常に動作し続け、DB呼び出しが行われ、1行が変更されたことを返しますが、実際にはDBにデータを渡すことはありません。エラーや例外はありません。見知らぬ人でも、ログはすべて正常に動作していることを示します。例外はありません。 また、バックグラウンドにプッシュしないと、これはうまく動作します。AndroidのSQLiteアップデートがAsyncTaskのバックグラウンドで動作しない

コール:(それはAndroidのSQLiteのコードのボンネットの下に起こっている場合を除く)

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

はまた、この呼び出しに関係するトランザクションがありません。

なぜこれが当てはまるのでしょうか? DB接続やSQLLiteに何か起こることはありますか?私はそれがバックラウンドにプッシュされたときに気づいていませんか?

UPDATE

私は、任意の成功なしでBeginTransaction/endtransとDBの呼び出しをラップしようとしている:私は、それが成功したかのように

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

まだ動作しますが、データは決してcommitted.PleaseノートデバイスからDBを取り出し、更新されていないことを確認しました。

+0

トランザクションのようなサウンドは、クエリの最後にコミットされません。あなた自身でクエリをコンパイルしようとしましたが、トランザクションブロック間でやり取りしましたか? – droidpl

+0

@droidpl Sry-関連するトランザクションはありません。 –

+0

データベース内で何か作業をするたびに、トランザクションが作成されますが、更新呼び出しによって舞台裏で行われます。あなたは何が起こっているのかをデバッグする暗黙のトランザクションでそれを行うことができますか? – droidpl

答えて

0

多くのテストの結果、時々onPauseメソッドがデータを更新していましたが、実際の問題は、SQLLite更新が、更新が実行されたときに実際には1つの列(FormStatus)を更新していないことでした。これは、バックグラウンドで実行している場合のみでした。私は更新直後に結果を照会することでこれを確認しました。最終的な解決策は、動作したFormStatus列のみを更新するセカンダリ更新でした。 begintrans/endtransでのラッピングは役に立ちませんでした。

関連する問題