Вставка или любое отдельное действие автоматически включается в транзакцию, поэтому нет смысла заключать ее в транзакцию. Однако, если вы выполняли несколько вставок в цикле, затем начинали транзакцию до цикла, устанавливали ее как успешную, если она была успешной после цикла и заканчивали транзакцию после цикла, это имело бы преимущество.
Также нет необходимости использовать insertOrThrow , если только вы не хотите перехватить исключение, поскольку метод insert эффективно INSERT OR IGNORE, а результатом является rowid вставленной строки, которая будет 1 или больше (в большинстве случаев обычного использования).
- rowid является специальным, обычно скрытым столбцом, часто псевдонимом которого является использование столбца, определенного специально для
column_name INTEGER PRIMARY KEY
или column_name INTEGER PRIMARY KEY AUTOINCREMENT
Rowid Tables
Как таковое использование: -
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.