beginTransaction (), endTransaction () и setTransactionSuccessful (). Что именно они делают?

Я должен обеспечить синхронизацию при вставке, запросе, обновлении и удалении элементов из базы данных. Насколько я понимаюbeginTransaction() а такжеbeginTransactionNonExclusive() методы, которые мне нужны

Кроме тогоДокументация по SQLite описывает,EXCLUSIVEIMMEDIATE, а такжеDEFERRED неплохо.

Транзакции могут быть отложенными, немедленными или исключительными. Отложенный означает, что в базе данных не получено никаких блокировок, пока к базе данных не будет произведен первый доступ.

Если транзакция является немедленной, то зарезервированные блокировки получаются во всех базах данных, как только выполняется команда BEGIN, без ожидания использования базы данных. После 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() до. Мне действительно нужно добавить их?

Ответы на вопрос(2)

Решение Вопроса

важно использовать следующие поддерживаемые методы.

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

Для дальнейшего увидеть это ...В Android очень важно использовать транзакции при работе с базами данных.

 Denny24 сент. 2018 г., 20:30
Интересно, почему документация по Android нене говоря об этом ...developer.android.com/training/data-storage/sqlite

это делает приложение гладким. Так как SQLite рассматривает один курсор как одну транзакцию, поэтому, если мы будем использовать beginaction () перед тем, как вставить большой объем данных, затем использовать setTransactionSuccessful () second, а затем endTransaction () в конце, SQLite рассмотрит это вставить событие как одну транзакцию вместо сотен транзакций.

Ваш ответ на вопрос