データベースからアイテムを挿入、クエリ、更新、および削除するときに、同期を提供する必要があります。beginTransaction()
私が理解している限り、私beginTransactionNonExclusive()
が必要とする方法です。
SQLite のドキュメントに加えてEXCLUSIVE
、 、IMMEDIATE
、およびDEFERRED
非常によく説明されています。
トランザクションは、遅延、即時、または排他的である可能性があります。Deferred は、データベースが最初にアクセスされるまで、データベースでロックが取得されないことを意味します。
トランザクションが即時の場合、データベースが使用されるのを待たずに、BEGIN コマンドが実行されるとすぐにすべてのデータベースで RESERVED ロックが取得されます。BEGIN IMMEDIATE の後、他のデータベース接続は、データベースに書き込んだり、BEGIN IMMEDIATE または BEGIN EXCLUSIVE を実行したりできなくなります。ただし、他のプロセスはデータベースからの読み取りを続行できます。
排他的トランザクションにより、すべてのデータベースで EXCLUSIVE ロックが取得されます。BEGIN EXCLUSIVE の後、トランザクションが完了するまで、read_uncommitted 接続を除く他のデータベース接続はデータベースを読み取ることができず、例外のない他の接続はデータベースに書き込むことができません。
一部のスレッドがデータベースで動作している間、不要な挿入やクエリからある程度の保護を提供しているようです。しかし、それが同期を保証するかどうかはわかりません。
私のinsert
方法がありますContentProvider
。
@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()
。本当に追加する必要がありますか?