关于SQLite 3,是否需要在写入后读取?

时间:2019-07-07 04:32:01

标签: android sqlite

在与SQLITE3有关的Android应用程序中,
写完后需要阅读还是我们可以指望一次成功的交易?

更新以显示插入数据的功能:

clearerr()

1 个答案:

答案 0 :(得分:2)

插入或任何单个操作会自动包含在事务中,因此将其包装在事务中没有任何好处。但是,如果您要在循环中进行多次插入,然后在循环之前开始事务,将其设置为成功,如果成功,则在循环之后,然后在循环之后结束事务,这样做会有所帮助。

除非您要捕获异常,否则几乎不需要使用 insertOrThrow ,因为 insert 方法实际上是INSERT或IGNORE,结果是插入行的rowid ,该值应为1或更大(在大多数正常情况下)。

  • 是一个特殊的,通常隐藏的列,通常通过使用专门使用column_name INTEGER PRIMARY KEYcolumn_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
}

至:-

  

是写完后需要阅读还是我们可以指望一个   交易成功吗?

交易成功提交。提交有效地将数据写入磁盘,因此提交后无需执行任何操作。

  • 使用WAL(预写日志记录)将数据写入WAL文件而不是数据库(以及shm文件)。但是,如果WAL具有数据,则在访问数据库时,它会被有效地读取为数据库的一部分。选中WAL时,会将WAL数据写入数据库。