0

別のスレッドでデータベースにアイテムを挿入しようとしてAsyncQueryHandlerいますが、何かを挿入しようとするとSQLExceptionが発生します

例外

08-16 18:57:13.662: E/SQLiteLog(17319): (1) table Part1s has no column named name
08-16 18:57:13.672: E/SQLiteDatabase(17319): Error inserting frame_number=2 name=Jeff game_id=1
08-16 18:57:13.672: E/SQLiteDatabase(17319): android.database.sqlite.SQLiteException: table Part1s has no column named name (code 1): , while compiling: INSERT INTO Part1s(frame_number,name,game_id) VALUES (?,?,?)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at com.tyczj.bowling.providers.Games.insert(Games.java:382)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.content.ContentProvider$Transport.insert(ContentProvider.java:201)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.content.ContentResolver.insert(ContentResolver.java:864)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:96)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.os.Looper.loop(Looper.java:137)
08-16 18:57:13.672: E/SQLiteDatabase(17319):    at android.os.HandlerThread.run(HandlerThread.java:60)
08-16 18:57:13.672: E/AndroidRuntime(17319): FATAL EXCEPTION: AsyncQueryWorker
08-16 18:57:13.672: E/AndroidRuntime(17319): android.database.SQLException: Failed to insert row into content://com.tyczj.bowling.providers.Games/Part1s
08-16 18:57:13.672: E/AndroidRuntime(17319):    at com.tyczj.bowling.providers.Games.insert(Games.java:387)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.content.ContentProvider$Transport.insert(ContentProvider.java:201)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.content.ContentResolver.insert(ContentResolver.java:864)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:96)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.os.Looper.loop(Looper.java:137)
08-16 18:57:13.672: E/AndroidRuntime(17319):    at android.os.HandlerThread.run(HandlerThread.java:60)

ここに挿入します

        for(int i = 0;i<10;i++){
        int num = i+1;
        values.put(Games.NAMES_FRAME_NUM,num);
        values.put(Games.NAMES_GAME_ID,gameid);
        values.put(Games.NAMES_NAME,name);
        qHandler.startInsert(0, null, Games.NAMES_URI,values);
//          getContentResolver().insert(Games.NAMES_URI, values);
        names(i,name);
        values.clear();
        values.put(Games.PART1_FRAME_NUM,num);
        values.put(Games.PART1_NUM,"0");
        values.put(Games.PART1_GAME_ID,gameid);
        qHandler.startInsert(0, null, Games.PART1_URI,values);
//          getContentResolver().insert(Games.PART1_URI, values);
        values.clear();
        values.put(Games.PART2_FRAME_NUM,num);
        values.put(Games.PART2_NUM,"0");
        values.put(Games.PART2_GAME_ID,gameid);
        qHandler.startInsert(0, null, Games.PART2_URI,values);
//          getContentResolver().insert(Games.PART2_URI, values);
        values.clear();
        values.put(Games.TOTALS_FRAME_NUM,num);
        values.put(Games.TOTALS_FRAME_TOTAL,"0");
        values.put(Games.TOTALS_GAME_ID,gameid);
        qHandler.startInsert(0, null, Games.TOTALS_URI,values);
//          getContentResolver().insert(Games.TOTALS_URI, values);
        values.clear();
//          ContentValues values = new ContentValues();
        values.put(Games.POCKETS_BOWLER_ID,bowlerClickedID);
        values.put(Games.POCKETS_FRAME_NUM,i);
        values.put(Games.POCKETS_GAME_ID,gameID);
        values.put(Games.POCKETS_TEAM_ID, teamSelectedID);
        values.put(Games.POCKETS_TOURNAMENT_ID, tournamentID);
        values.put(Games.POCKETS_NUM, 0);
        values.put(Games.POCKETS_SEASON, pref.getLong(Preferences.SELECTED_SEASON, 1));
        qHandler.startInsert(0, null, Games.POCKETS_URI,values);
//          getContentResolver().insert(Games.POCKETS_URI, values);
        values.clear();
    } 

エラーが表示されていることはわかっていますno such columnが、forループでわかるように、挿入するたびに値をクリアします。通常getContentResolver().insert()を使用するだけでは問題はなく、このエラーは発生しないため、値が何らかの形で混同されているようです。

そして、誰かが言う前に、AsyncTask私はすでにそれを実行しました、そしてforループを実行するとき、挿入はまだUIを保持します。私が経験していることについては、この質問を参照してください

とにかく、これを引き起こしているのは何ですか?

4

2 に答える 2

1

非同期更新が行われている間、同じContentValuesオブジェクトに対して同時アクセスを行っている可能性があると思います。

コールバックが受信されるまで待つ必要がありonInsertCompleteます。または、より簡単な方法は、毎回ContentValuesの新しいオブジェクトを取得することです。

于 2012-08-17T00:41:31.623 に答える
0

android.database.sqlite.SQLiteException:テーブルPart1sにnameという名前の列がありません(コード1):、コンパイル中:INSERT INTO Part1s(frame_number、name、game_id)VALUES(?、?、?)

データベースに列があると思ったからといって、それが実際に存在することを意味するわけではありません。データベースのcreateステートメントとテーブルの内容を確認し、これを確認してください。そうして初めて、問題を特定できます。

于 2012-08-17T01:10:58.653 に答える