假设我有一个方法来插入一个产品,该产品返回一个取决于插入是否成功的布尔值:
public boolean insertProduct(Product product) {
ContentValues values = new ContentValues();
values.put("name", product.name);
values.put("price", product.price);
boolean inserted = true;
SQLiteDatabase db = this.getWritableDatabase();
try {
db.insertOrThrow("products",null,values);
} catch (SQLException e) {
inserted = false;
}
return inserted;
}
如果我在另一项活动中:
boolean productAdded = dbHelper.insertProduct(newProduct);
if (productAdded) {
// do something
} else {
// do something else
}
我知道数据库插入需要一些时间(可能在非常慢的设备上使用相对较长的时间),所以这是一种安全的方法来测试插入是否成功?将if (productAdded)
等待,直到它从insertProduct()
方法获得返回值,并且方法是否会等待返回inserted
布尔值,直到插入成功或失败?
答案 0 :(得分:1)
将if(productAdded)等到它从insertProduct()
方法获得返回值
Yes it will Wait.
默认情况下,所有Sqlite数据库操作仅在UI线程上执行。
答案 1 :(得分:1)
是的,默认情况下,每个执行语句都是同步的。这意味着每个语句都会在分配到左侧之前等待右侧操作完成。它不仅仅是数据库调用。每个需要一段时间的语句都会有效地阻止代码执行直到完成,因此需要异步方法。
在你的情况下,是的,可以安全地假设返回的布尔值将是完整函数执行的正确值,但正如你正确指出的那样,它需要时间,并且可以保留代码。在android中,您可以考虑将此代码移动到异步任务并触发其他活动,以通过异步任务的onPostExecute中的处理程序运行它的功能。
答案 2 :(得分:1)
SqliteDatabase的insertOrThrow方法也返回一个long值,表示插入行的id。您还可以检查长值,如果long值为-1,则不插入行,但如果它的值不是-1,则成功插入行。