16

データベースからアイテムを挿入、クエリ、更新、および削除するときに、同期を提供する必要があります。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()。本当に追加する必要がありますか?

4

2 に答える 2

12

もちろんAndroidで!信頼性の高いデータ操作を行う場合は、次のサポートされている方法を使用することが重要です。

BeginTransaction();
SetTransactionSuccessful();
EndTransaction(); 

詳細については、これを参照してください...<a href="http://www.helloandroid.com/tutorials/database-transactions" rel="noreferrer">Android では、データベースを操作するときにトランザクションを使用することが非常に重要です。

于 2013-05-16T04:39:39.913 に答える
1

はい、アプリがスムーズになります。SQLite は 1 つのカーソルを 1 つのトランザクションと見なすため、大量のデータを挿入する前に begin transaction() を使用し、次に setTransactionSuccessful() を使用し、最後に endTransaction() を使用すると、SQLite はこれを考慮します。何百ものトランザクションではなく、1 つのトランザクションとしてイベントを挿入します。

于 2017-04-06T11:34:05.153 に答える