データベースから項目を挿入、照会、更新、削除するときに同期を提供する必要があります。私が理解する限り、beginTransaction()
とbeginTransactionNonExclusive()
が私が必要とする方法です。beginTransaction()、endTransaction()、およびsetTransactionSuccessful()です。彼らは正確に何をしていますか?
さらに、SQLite documentationは、EXCLUSIVE
,IMMEDIATE
およびDEFERRED
を非常によく表している。
トランザクションは、遅延、即時、または排他にすることができます。遅延された手段 は、データベースが最初にアクセスされるまでデータベースでロックが取得されないことを意味します。
トランザクションが即時の場合、 データベースの使用を待たずに、BEGINコマンドが実行されるとすぐに、すべてのデータベースで の予約ロックが取得されます。 BEGIN IMMEDIATE後、他の データベース接続はデータベースに書き込むことができず、 BEGIN IMMEDIATEまたはBEGIN EXCLUSIVEを実行することはできません。しかし、他のプロセスは、 をデータベースから読み取ることができる。
排他的なトランザクションによって、すべての データベースで排他ロックが取得されます。 BEGIN EXCLUSIVEの後、read_uncommitted接続を除く他のデータベース接続 は、 データベースを読み取ることはできず、他の接続は例外なく、トランザクションが完了するまで データベースに書き込むことはできません。
一部のスレッドがデータベースで作業している間に、不要な挿入やクエリから保護されているようです。しかし、同期が保証されているかどうかはわかりません。
私のContentProvider
のinsert
メソッドがあります。
@Override
public Uri insert(Uri baseUri, ContentValues values) {
try {
mDatabase = mHelper.getWritableDatabase();
mDatabase.beginTransaction(); // EXCLUSIVE
switch (sUriMatcher.match(baseUri)) {
case UriCodes.COUNTRIES:
case UriCodes.CONTINENTS:
case UriCodes.ORGS:
String table = baseUri.getLastPathSegment();
long rowId = mDatabase.insert(table, null, values);
Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId));
mDatabase.setTransactionSuccessful();
return uri;
default:
mDatabase.endTransaction();
throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri);
}
} finally {
mDatabase.endTransaction();
}
}
は私が前にbeginTransaction()
、endTransaction()
、およびsetTransactionSuccessful()
なしで何の問題もありませんでした。私は本当にそれらを追加する必要がありますか?