我有一个本地数据库来存储moviedb.org api提供的电影信息。每次代码都会将这些信息添加到我的本地数据库中,但是我遇到了唯一的约束错误。我知道它是因为我将电影ID设置为独特的,因为我一开始认为我必须避免重复相同的信息。
这是我的数据库代码:
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已存在但其他相关信息已更改,则更新。 感谢。
答案 0 :(得分:1)
如果您只是删除UNIQUE约束并尝试批量插入数据,如果重复相同的项目,它将在您的数据库中重复。但是,您可以通过调用insertWithOnConflict
来替换插入方法调用然后,您可以决定应该如何处理完全重复的内容。默认为忽略(CONFLICT_IGNORE)。您可能正在寻找CONFLICT_REPLACE
当发生UNIQUE约束违规时,预先存在的行 导致约束违反被删除之前插入或 更新当前行。因此总是发生插入或更新。该 命令继续正常执行。
但根据您的要求,可以使用CONFLICT_IGNORE或CONFLICT_REPLACE。