我有一個本地數據庫來存儲moviedb.org api提供的電影信息。每次代碼將這些信息bulkinsert到我的本地數據庫,但我得到了唯一的約束錯誤。我知道它,因爲我已經設置了電影ID是唯一的,因爲我首先想到了我必須避免重複相同的信息。android sqlite數據庫約束
這裏是我的數據庫代碼:
public void onCreate(SQLiteDatabase db) {
final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " + MovieContract.MovieEntry.TABLE_NAME + " (" +
MovieContract.MovieEntry._ID + " INTEGER PRIMARY KEY," +
MovieContract.MovieEntry.COLUMN_MOVIE_ID + " INTEGER UNIQUE NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_NAME + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_GENRE + " INTEGER NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_OVERVIEW + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_RELEASE_DATE + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_POSTER_PATH + " TEXT, " +
MovieContract.MovieEntry.COLUMN_MOVIE_POPULARITY + " DOUBLE NOT NULL, " +
MovieContract.MovieEntry.COLUMN_MOVIE_RATING + " DOUBLE NOT NULL " +
");";
db.execSQL(SQL_CREATE_MOVIE_TABLE);
}
這裏是我的bulkinsert功能:
public int bulkInsert(Uri uri, ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
switch (match) {
case MOVIE:
db.beginTransaction();
int returnCount = 0;
try {
for (ContentValues value : values) {
long _id = db.insert(MovieContract.MovieEntry.TABLE_NAME, null, value);
if (_id != -1) {
returnCount++;
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
getContext().getContentResolver().notifyChange(uri, null);
return returnCount;
default:
return super.bulkInsert(uri, values);
}
}
所以,我想知道如果我刪除這一獨特的關鍵字,將bulkinsert仍然插入重複信息還是會自動更新同一個id的信息?如果沒有,我應該怎麼做才能確保bulkinsert如果是相同的信息則不做任何事情,如果id已經存在但更新了其他相關信息則更新。 謝謝。
非常感謝您的回答。但是在我刪除UNIQUE關鍵字後,它仍然得到相同的錯誤,我想這是因爲我沒有刪除本地數據庫。你熟悉android應用程序開發嗎?我怎麼能清除本地數據庫? –
但我的建議是不刪除唯一的關鍵字,我只是說如果你這樣做會發生什麼。你真正應該做的是insertWithConflict。至於清除數據庫或改變它。這是一個不同的問題,請問一個,我(或其他人)會愉快地回答。 – e4c5