2013-12-12 94 views
0

插入數據到約束失敗的SQLite表插入數據到約束失敗的SQLite表

我試圖插入數據到Android上的SQLite表。 _id是表的主鍵,我用這個方法插入行:

public void addSomeData(int id, String datetime) { 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(KEY_ID, id); 
    contentValues.put(KEY_DATETIME, datetime); 
    mDb.insert(TABLE, null, contentValues); 
} 

我得到的問題是,有時主鍵約束驗證,我想用類似INSERT IF NOT EXISTS,但最好的東西,將與ContentValues一起使用。我有什麼選擇?我知道insertOrThrow()insertWithOnConflict()方法只返回不同的值,或者我應該使用這些方法之一?

回答

0

在我的情況下,「約束失敗」發生是因爲我有一些相互依賴的表。至於「插入如果不存在」,你可以用這個ID來查詢,並檢查光標的計數是否大於零。檢查我已經在我的應用程序中使用的方法。

public boolean isRowExists(long rowId) { 

    Cursor cursor = database.query(this.tableName, this.columns, DBSQLiteHelper.COLUMN_ID + " = ? ", new String[] { "" + rowId }, null, null, null); 

    int numOfRows = cursor.getCount(); 
    cursor.close(); 

    return (numOfRows > 0) ? true : false; 
} 
+0

當我插入多行時,它會有效嗎? – syntagma

+0

@REACHUS這就是你要找的。當我爲你尋找答案時,我只是看到了它。我還會更新我的一些大型查詢。 http://stackoverflow.com/a/4330694/1080954 – osayilgan

+0

謝謝。如果我在表中設置了「主鍵」,我應該如何執行INSERT/UPDATE? – syntagma

0

這樣做,你可以簡單地查詢數據庫,看看是否與該鍵的行存在並插入新行只有在查詢返回數據。

+0

我知道,但我插入很多行,並不會有效。 – syntagma

+0

@REACHUS這正是數據庫用來檢查每個記錄的約束條件(並且在檢查之後,該記錄位於緩存中)。 –

+0

使用'insertWithOnConflict()',如其他答案中的建議那樣? – syntagma

1

使用insertWithOnConflict()CONFLICT_IGNORE

對於任何錯誤,將返回新行或現有行的ROWID /主鍵,-1。