О SQLite 3, обязательно ли читать после записи? - PullRequest
2 голосов
/ 07 июля 2019

В приложении Android, касающемся SQLITE3,
Требуется ли чтение после записи или мы можем просто рассчитывать на успешную транзакцию?

Обновление для отображения функции вставки данных:

    // Insert a post into the database
    public void addM0(Store_M0_DataClass mStore_M0_DataClass)
    {
       // Create and/or open the database for writing
        SQLiteDatabase db = getWritableDatabase();



        // It's a good idea to wrap our insert in a transaction. This helps with performance and ensures
        // consistency of the database.
        db.beginTransaction();
        try
        {
            // The user might already exist in the database (i.e. the same user created multiple posts).

            ContentValues values = new ContentValues();
            values.put(KEY_M0_ID, mStore_M0_DataClass.getM0_ID());
            values.put(KEY_M0_IMAGE1, mStore_M0_DataClass.getM0_Image1());
            values.put(KEY_M0_IMAGE2, mStore_M0_DataClass.getM0_Image2());
            values.put(KEY_M0_ENABLE, mStore_M0_DataClass.getM0_Enable());

            db.insertOrThrow(TABLE_M0, null, values);

            db.setTransactionSuccessful();
        }
        catch (Exception e)
        {
        }
        finally
        {
            db.endTransaction();
        }
    }

1 Ответ

2 голосов
/ 07 июля 2019

Вставка или любое отдельное действие автоматически включается в транзакцию, поэтому нет смысла заключать ее в транзакцию. Однако, если вы выполняли несколько вставок в цикле, затем начинали транзакцию до цикла, устанавливали ее как успешную, если она была успешной после цикла и заканчивали транзакцию после цикла, это имело бы преимущество.

Также нет необходимости использовать insertOrThrow , если только вы не хотите перехватить исключение, поскольку метод insert эффективно INSERT OR IGNORE, а результатом является rowid вставленной строки, которая будет 1 или больше (в большинстве случаев обычного использования).

  • rowid является специальным, обычно скрытым столбцом, часто псевдонимом которого является использование столбца, определенного специально для column_name INTEGER PRIMARY KEY или column_name INTEGER PRIMARY KEY AUTOINCREMENT Rowid Tables
    • (отмечая, что AUTOINCREMENT обычно не требуется и имеет накладные расходы) SQLite Autoincrement

Как таковое использование: -

public long addM0(Store_M0_DataClass mStore_M0_DataClass)
{
   // Create and/or open the database for writing
    SQLiteDatabase db = getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_M0_ID, mStore_M0_DataClass.getM0_ID());
    values.put(KEY_M0_IMAGE1, mStore_M0_DataClass.getM0_Image1());
    values.put(KEY_M0_IMAGE2, mStore_M0_DataClass.getM0_Image2());
    values.put(KEY_M0_ENABLE, mStore_M0_DataClass.getM0_Enable());
    return db.insert(TABLE_M0, null, values);
}

Однако, если вы хотите сохранить несколько объектов Store_M0_DataClass, вы можете получить: -

public int addManyMo(Store_M0_DataClass[] mStore_M0_DataClasses) {
    int rv = 0;
    SQLiteDatabase db = this.getWritableDatabase();
    db.beginTransaction();// <<<<<<<<<< wrap all inserts in a transaction
    for (Store_M0_DataClass m0: mStore_M0_DataClasses) {
        if(addM0(m0) > 0) {
            rv++;
        }
    }
    // Assumes OK if any inserts have worked, not if none have worked
    if (rv > 0) {
        db.setTransactionSuccessful(); 
    }
    db.endTransaction();
    return rv; // Retruns the number of rows inserted
}

Что касается: -

Требуется ли читать после записи или мы можем просто рассчитывать на успешная транзакция?

Успешная транзакция фиксирует что было в транзакции. Comitting - это эффективная запись данных на диск, поэтому после фиксации не нужно ничего делать.

  • с WAL (запись в журнал впереди) данные записываются в файл WAL, а не в базу данных (а также в файл shm). Однако при доступе к базе данных, если в WAL есть данные, они считываются частью базы данных. Данные WAL записываются в базу данных, когда установлен WAL.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...