2015-10-07 188 views
1

我有一個本地數據庫來存儲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已經存在但更新了其他相關信息則更新。 謝謝。

回答

1

如果您只是刪除UNIQUE約束並嘗試批量插入數據,如果重複相同的項目,它將被複制到數據庫中。但是,您可以用呼叫替換您的插入方法調用insertWithOnConflict

然後您可以決定應該如何處理重複項。默認是忽略(CONFLICT_IGNORE)。您可能正在尋找CONFLICT_REPLACE

當一個UNIQUE限制衝突發生時, 是造成約束違反預先存在的行被插入或更新 當前行之前刪除。因此插入或更新總是會發生。 命令繼續正常執行。

但是可以根據您的要求使用CONFLICT_IGNORE或CONFLICT_REPLACE。

+0

非常感謝您的回答。但是在我刪除UNIQUE關鍵字後,它仍然得到相同的錯誤,我想這是因爲我沒有刪除本地數據庫。你熟悉android應用程序開發嗎?我怎麼能清除本地數據庫? –

+0

但我的建議是不刪除唯一的關鍵字,我只是說如果你這樣做會發生什麼。你真正應該做的是insertWithConflict。至於清除數據庫或改變它。這是一個不同的問題,請問一個,我(或其他人)會愉快地回答。 – e4c5