1

SQLLite データベースの数値を合計し、同じデータベースに合計を書き込む関数があります。メイン アクティビティが待機している間、バックグラウンド タスクでこれを実行しています。

これはしばらくの間は適切に機能しますが、通常はループの途中で次のように失敗します。

データベース ファイルを開けません (コード 14):、コンパイル中: PRAGMA journal_mode

これは毎回データベースの異なる行で発生するため、1 つのエントリがエラーを引き起こしているとは思いません。

私のコード---

アクティビティ:

...
calculateStats();
...


public void  calculateStats(final String MY_GROUP){



   calculateTask = new AsyncTask<Void, Void, Void>() {

            @Override
               protected Void doInBackground(Void... params) {
                Looper.prepare();
                StatCalculator calculator = new StatCalculator();
                calculator.writeTotalA(MY_GROUP);
                calculator.writeTotalB(MY_GROUP);
                calculator = null;

                   return null;
               }

               @Override
               protected void onPostExecute(Void result) {



                }
           };
           calculateTask.execute(null, null, null);

 }

統計電卓:

public void writeTotalB(String my_group){
    DatabaseManager db = new DatabaseManager(this); 
    DB_GROUP = "DB" + my_group+ ".DB";

    SQLiteDatabase groupDB = SQLiteDatabase.openDatabase(DB_PATH + DB_GROUP, null, SQLiteDatabase.OPEN_READWRITE); 
     Cursor groupCursor = groupDB .query("ItemTable", null, null, null, null, null, null);



     if (groupCursor != null  ) {
          for (int i = 0; i < groupCursor .getCount(); i++) {


            ...
            //calculating total here (totalPoints)
            ...     



     //write total to database:
    db.update_byID(DB_GROUP , id, "Total", totalPoints);



          }


      }

     groupDB .close();
     groupCursor.close();
      db = null;
}

コードは、calculator.writeTotalA(MY_GROUP)を完全に正常に処理します。クラッシュは常にcalculator.writeTotalB(MY_GROUP)の途中で発生します

これが、このデータベースに対して同時に読み取りと書き込みを行っているためなのか、それとも何なのかはわかりません。だとしたらもっと早く壊れると思います。

どんな助けでも大歓迎です。

4

1 に答える 1

2

とった。

方法

db.update_byID(DB_GROUP , id, "Total", totalPoints);

エントリごとにデータベースの新しいインスタンスを開き、それを閉じませんでした。

于 2013-07-22T01:56:59.143 に答える