我将所有记录(备份)从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)
答案 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 ...");