對不同於ID的列可以具有UNIQUE約束。例如:
CREATE TABLE TEST (_id INTEGER PRIMARY KEY AUTOINCREMENT, server_id INTEGER NOT NULL, name TEXT, UNIQUE(server_id))
有了這個表,在您的內容提供商的插入方法,你可以做這樣的事情:
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
final SQLiteDatabase db = mDatabase.getWritableDatabase();
final int match = mUriMathcer.match(uri);
switch (match) {
case TEST:
insertOrUpdateById(db, uri, "TEST",
contentValues, "server_id");
getContext().getContentResolver().notifyChange(uri, null, false);
return Contract.Test.buildTestUri(contentValues.getAsString("server_id"));
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
/**
* In case of a conflict when inserting the values, another update query is sent.
*
* @param db Database to insert to.
* @param uri Content provider uri.
* @param table Table to insert to.
* @param values The values to insert to.
* @param column Column to identify the object.
* @throws android.database.SQLException
*/
private void insertOrUpdateById(SQLiteDatabase db, Uri uri, String table,
ContentValues values, String column) throws SQLException {
try {
db.insertOrThrow(table, null, values);
} catch (SQLiteConstraintException e) {
int nrRows = update(uri, values, column + "=?",
new String[]{values.getAsString(column)});
if (nrRows == 0)
throw e;
}
}
我希望它能幫助。乾杯!
你知道 「UPSERT」 命令的**更換**? https://www.sqlite.org/lang_replace.html - 它插入一條新記錄(如果不存在或者它更新現有記錄)。 –
@BobMalooga不,我不知道這一點,但你可以在'ContentProvider'中使用它嗎?所有內容提供商都有插入,更新,替換或刪除 – tyczj
@tyczi否...抱歉,我不知道ContentProvider限制。我以爲你可以分別使用rawQuery或execSQL來獲取和設置數據。現在看來ContentProvider很遺憾不提供這些功能。所以 - 我從內容提供商那裏瞭解了一些有關內容(從未使用 - 並且可能會在未來跳過)。你現在知道SQLite提供了「upserts」。 ;) –