我正在努力熟悉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取出数据库并查看它时,内容完全是空的。
我无法理解我所缺少的东西。
任何建议都将不胜感激。
谢谢, 小号
答案 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)。当我删除调用时,我得到了我想要的结果(插入了多个记录)。
不正确!! ******* /