SQLiteDatabase.insertOrThrow不会抛出但不会插入数据

时间:2010-11-13 15:14:31

标签: android sqlite

我正在努力熟悉Android及其数据库API。 我创建了一个继承自SQLiteOpenHelper的类 是我如何在数据库中创建表

@Override
public void onCreate(SQLiteDatabase db) {

    try {
        db.execSQL("CREATE TABLE " + FUELS_TABLE_NAME + " ("
                + "_ID INTEGER PRIMARY KEY AUTOINCREMENT, "
                + "DATE_OF_FUELS DATE DEFAULT CURRENT_TIME,"
                + "SELLER_POSITION TEXT DEFAULT 'unknown',"
                + "AMOUNT REAL"
                + ");"
        );
    } catch (SQLException e) {
        Log.e(DATABASE_NAME, e.toString());
    }
}

用于向DB添加数据的功能如下所示

是同一个班级
public void addNewFuel(float amount) {

    // Create the content to insert into the database
    ContentValues newEntry = new ContentValues();
    newEntry.put("amount", amount);

    // Get database handler
    try {
        db = getWritableDatabase();
    } catch (SQLException e) {
        Log.e(DATABASE_NAME, e.toString());
        return;
    }

    // Begin transaction and insert data
    long returnedValue;
    db.beginTransaction();
    try {
        returnedValue = db.insertOrThrow(FUELS_TABLE_NAME, null, newEntry);
        Log.v(DATABASE_NAME, "return value " + returnedValue);
    } catch (SQLException e) {
        Log.e(DATABASE_NAME, e.toString());
    } finally {
        db.endTransaction();
    }

    db.close();
}

但显然没有添加任何数据。 returnValue始终为1.方法不抛出, 当我用adb取出数据库并查看它时,内容完全是空的。

我无法理解我所缺少的东西。

任何建议都将不胜感激。

谢谢, 小号

2 个答案:

答案 0 :(得分:29)

McStretch的回答是不正确的。 getWritableDatabase()不会为您的代码创建交易,文档中的引用行指的是用于onCreate和onUpgrade方法的交易,这意味着您不需要在这些方法中添加交易代码。您仍然需要为需要事务的任何其他方法添加事务代码。

emitrax的代码无法正常运行,因为db.setTransactionSuccessful()未被调用,这意味着该事务将由db.endTransaction()回滚。

答案 1 :(得分:-3)

请参阅benritz对正确解决方案的回答。这个答案是不正确的,但遗憾的是我无法将其删除,因为这是一个可接受的帖子。

/ ******* NOT CORRECT !!

由于您继承自SQLiteOpenHelper,因此对getWritableDatabase()的调用已启动数据库事务。来自SQLiteOpenHelper API

  

交易用于确保   数据库始终是明智的   状态。

因此,您无需致电db.beginTransaction()db.endTransaction()。那些无关的事务调用会搞乱你的插入。我将相同的场景插入到我的项目中,并发现在使用这些事务方法时返回了相同的索引(在我的情况下为6)。当我删除调用时,我得到了我想要的结果(插入了多个记录)。

不正确!! ******* /