将记录从table1复制到表2时出错.sqlite约束异常错误代码19约束失败

时间:2012-11-29 15:56:23

标签: android sqlite

我将所有记录(备份)从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,但我也要复制它们。我该如何实现这一目标。任何帮助都会非常值得赞赏..!

这些是堆栈跟踪:

  

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):at com.dana.db.SelectedCandidatesDB.copyToRecount1(SelectedCandidatesDB.java:257)
  E / AndroidRuntime(30294):at com.dana.votecount.VoteRecount.fetchAllFromRecount1(VoteRecount.java:161)E / AndroidRuntime(30294):at com.dana.votecount.VoteRecount.access $ 1(VoteRecount.java:158)<登记/>   E / AndroidRuntime(30294):at com.dana.votecount.VoteRecount $ 2 $ 1.onClick(VoteRecount.java:107)

2 个答案:

答案 0 :(得分:0)

错误是由自动增量引起的,因为你不能或者为自动增量的列赋值,你应该在查询中指定null或更改

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

replce *,列名不提自动增量列名,也适用于同一查询中的table1

答案 1 :(得分:0)

实际上可能是to set autoincrement columns to a specific value,但前提是该值尚不存在。

记录很可能已存在于RECOUNT1表中。

要确保没有旧记录,请在插入之前删除它们:

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

或者,如果您知道没有任何记录发生更改,则可以使用INSERT OR IGNORE command仅插入目标表中尚不存在ID的记录:

mDb.execSQL("INSERT OR IGNORE INTO " + TABLE_RECOUNT1 + " SELECT ...");