Android 将记录从表1复制到表2时出错。sqlite约束异常错误代码19约束失败
我正在将所有记录从表1复制到同一数据库中的表2。这是我的第一个数据库应用程序 以下是表1的结构:Android 将记录从表1复制到表2时出错。sqlite约束异常错误代码19约束失败,android,sqlite,Android,Sqlite,我正在将所有记录从表1复制到同一数据库中的表2。这是我的第一个数据库应用程序 以下是表1的结构: private static final String CREATE_SELECTED_CAND_TABLE = " CREATE TABLE if not exists " + TABLE_SELECTED_CAND + "(" + KEY_ID + " integer PRIMARY KEY autoincrement,"
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" + ")";
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" + ")";
表2结构:
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" + ")";
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/AndroidRuntime30294:
android.database.sqlite.SQLiteConstraintException:错误代码19:
约束失败
E/AndroidRuntime30294:at-android.database.sqlite.SQLiteStatement.native_执行方法
E/AndroidRuntime30294:at-android.database.sqlite.SQLiteStatement.executeUpdateDeleteSQLiteStatement.java:92
E/AndroidRuntime30294:at-android.database.sqlite.SQLiteDatabase.executeSqlSQLiteDatabase.java:2028
E/AndroidRuntime30294:at-android.database.sqlite.SQLiteDatabase.execsqlitedatabase.java:1968
E/AndroidRuntime30294:com.dana.db.SelectedCandidatesDB.copytoreCount1 SelectedCandidatesDB.java:257
E/AndroidRuntime30294:at com.dana.votecount.VoteRecount.FetchAllFromCount1votereCount.java:161 E/AndroidRuntime30294:at com.dana.votecount.VoteRecount.access$1VoteRecount.java:158
E/AndroidRuntime30294:com.dana.votecount.VoteRecount$2$1.onClickVoteRecount.java:107
该错误是由于自动递增导致的,因为您不能为自动递增的列指定或赋值。您应该在查询中为该列指定null或change
mDb.execSQL插入+表\u重新计数1+选择*FROM
+表_所选_CAND
使用列名的replce*不提及自动递增列名,并且对于同一查询中的表1,实际上是可能的,但前提是该值尚不存在
记录可能已经存在于重新计数1表中
要确保没有旧记录,请在插入之前删除它们:
mDb.execSQL("DELETE FROM " + TABLE_RECOUNT1);
mDb.execSQL("INSERT INTO " + TABLE_RECOUNT1 + " SELECT ...");
或者,如果您知道没有任何记录已更改,则可以使用仅插入ID在目标表中尚不存在的记录:
mDb.execSQL("INSERT OR IGNORE INTO " + TABLE_RECOUNT1 + " SELECT ...");
请你展示一下表格结构的导出,这样我们就可以在适当的地方看到约束了吗?我应该只删除一个具有这个id的行。我无法将_id分配为空。。如何更改此查询以实现上述。。!工作起来很有魅力。。!衷心感谢,我使用了你的第一个建议。删除表格并插入表格!