2012-11-29 27 views
1

我正在將table1中的所有記錄(備份)複製到同一個數據庫中的table2。這是我第一個數據庫應用程序。將表1中的記錄複製到表2時出錯。sqlite約束異常錯誤代碼19約束失敗

下面是表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):在Android.database.sqlite.SQLiteStatement.native_execute(Native Method)
E/AndroidRuntime(30294):at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:92)
E/AndroidRuntime(30294):at android.databa se.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2028)
E/AndroidRuntime(30294):在android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1968)
E/AndroidRuntime(30294):在E/AndroidRuntime(30294):at com.dana.votecount.VoteRecount.fetchAllFromRecount1(VoteRecount.java:161)E/AndroidRuntime(30294):at在com.dana.votecount.VoteRecount.fetchAllFromRecount1(VoteRecount.java:161)E/AndroidRuntime com.dana.votecount.VoteRecount.access $ 1(VoteRecount.java:158)
E/AndroidRuntime(30294):在com.dana.votecount.VoteRecount $ 2 $ 1.onClick(VoteRecount.java:107)

+0

請問您能否顯示錶結構的導出,以便我們可以看到約束條件? – Nitroware

回答

0

它實際上可能to set autoincrement columns to a specific value沒有提到自動增量列名,也爲表1,但前提是該值尚不存在。

表中的記錄可能已存在於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 ..."); 
+0

工程就像一個魅力..!衷心感謝「CL」我使用了你的第一個建議。刪除表格並插入表格! –

0

錯誤是由於在自動增量,因爲你不能或分配給定值,以該自動增量應先分配在查詢

mDb.execSQL空或更改列(「INSERT INTO‘+ TABLE_RECOUNT1 +’SELECT * FROM」 + TABLE_SELECTED_CAND) ;

replce *與列名在同一查詢

+0

我應該只用這個ID刪除一行。我不能指定_id爲空..我怎樣才能改變這個查詢來實現上述..! –

相關問題