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);

现在的问题是,只有当所有列都不为空时才复制 我有一些列为空,但我也想复制它们。我该如何实现这一目标。?任何帮助将是非常可观的..!

这些是堆栈跟踪:

E/AndroidRuntime(30294): android.database.sqlite.SQLiteConstraintException:错误代码 19: 约束失败
E/AndroidRuntime(30294): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
E/AndroidRuntime(30294): at 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

实际上可以将自动增量列设置为特定值,但前提是该值尚不存在。

记录很可能已经存在于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 回答
0

该错误是由于自动增量造成的,因为您不能或为自动增量列分配值,您应该在查询中分配 null 或更改

mDb.execSQL("插入"+TABLE_RECOUNT1+"SELECT * FROM"+TABLE_SELECTED_CAND);

replce * 与列名未提及自动增量列名以及同一查询中的 table1

于 2012-11-29T16:01:33.347 回答