1

同じデータベース内のtable1からtable2にすべてのレコード(バックアップ)をコピーしています。これは私の最初のデータベースアプリケーションです。

表1の構造は次のとおりです。

private static final String CREATE_SELECTED_CAND_TABLE = " CREATE TABLE if not exists "
        + TABLE_SELECTED_CAND
        + "("
        + KEY_ID
        + " integer PRIMARY KEY autoincrement,"
        + KEY_NAME1
        + " TEXT,"
        + KEY_NAME2
        + " TEXT,"
        + KEY_NAME3
        + " TEXT,"
        + KEY_NAME4
        + " TEXT," + KEY_NAME5 + " TEXT" + ")";

表2構造:

private static final String CREATE_SELECTED_CAND_RECOUNT1 = " CREATE TABLE if not exists "
        + TABLE_RECOUNT1
        + "("
        + KEY_ID
        + " integer PRIMARY KEY autoincrement,"
        + KEY_NAME1
        + " TEXT,"
        + KEY_NAME2
        + " TEXT,"
        + KEY_NAME3
        + " TEXT,"
        + KEY_NAME4
        + " TEXT," + KEY_NAME5 + " TEXT" + ")";

そして私はこのようにコピーしています:

    mDb.execSQL(" INSERT INTO " + TABLE_RECOUNT1 + " SELECT * FROM "
            + TABLE_SELECTED_CAND);

問題は、すべての列がnullでない場合にのみ コピーすることです。いくつかの列をnullとして持っていますが、それらもコピーしたいと思います。どうすればこれを達成できますか?どんな助けでも非常に高く評価されるでしょう..!

これらはスタックトレースです:

E / AndroidRuntime(30294):android.database.sqlite.SQLiteConstraintException:エラーコード19:制約に失敗し
ました E / AndroidRuntime(30294):android.database.sqlite.SQLiteStatement.native_execute(ネイティブメソッド)
E / AndroidRuntime(30294):でandroid.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:92)
E / AndroidRuntime(30294):android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2028)
E / AndroidRuntime(30294):android。 database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1968)
E / AndroidRuntime(30294):com.dana.db.SelectedCandidatesDB.copyToRecount1(SelectedCandidatesDB.java:257)
E / AndroidRuntime(30294):com.dana.votecount.VoteRecount.fetchAllFromRecount1(VoteRecount.java:161)でE / AndroidRuntime(30294):com.dana.votecount.VoteRecount.access $ 1(VoteRecount.java:158)で
E /AndroidRuntime(30294):com.dana.votecount.VoteRecount $ 2 $ 1.onClick(VoteRecount.java:107)

4

2 に答える 2

0

エラーは自動インクリメントが原因です。これは、自動インクリメントである列に値を与えることができないか、割り当てることができないためです。nullを割り当てるか、クエリを変更する必要があります。

mDb.execSQL( "INSERT INTO" + TABLE_RECOUNT1 + "SELECT * FROM" + TABLE_SELECTED_CAND);

replce *は、列名が自動インクリメント列名に言及しておらず、同じクエリのtable1にも適用されます

于 2012-11-29T16:01:33.347 に答える
0

自動インクリメント列を特定の値に設定することは実際には可能ですが、その値がまだ存在しない場合に限ります。

レコードはすでにRECOUNT1テーブルに存在している可能性があります。

古いレコードがないことを確認するには、挿入する前にそれらを削除します。

mDb.execSQL("DELETE FROM " + TABLE_RECOUNT1);
mDb.execSQL("INSERT INTO " + TABLE_RECOUNT1 + " SELECT ...");

または、どのレコードも変更されていないことがわかっている場合は、INSERT OR IGNOREコマンドを使用して、IDがターゲットテーブルにまだ存在しないレコードのみを挿入できます。

mDb.execSQL("INSERT OR IGNORE INTO " + TABLE_RECOUNT1 + " SELECT ...");
于 2012-11-30T09:59:10.193 に答える