Android数据库操作和返回值

时间:2015-01-02 07:37:53

标签: android mysql

假设我有一个方法来插入一个产品,该产品返回一个取决于插入是否成功的布尔值:

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布尔值,直到插入成功或失败?

3 个答案:

答案 0 :(得分:1)

将if(productAdded)等到它从insertProduct()方法获得返回值

Yes it will Wait.

默认情况下,所有Sqlite数据库操作仅在UI线程上执行。

答案 1 :(得分:1)

是的,默认情况下,每个执行语句都是同步的。这意味着每个语句都会在分配到左侧之前等待右侧操作完成。它不仅仅是数据库调用。每个需要一段时间的语句都会有效地阻止代码执行直到完成,因此需要异步方法。

在你的情况下,是的,可以安全地假设返回的布尔值将是完整函数执行的正确值,但正如你正确指出的那样,它需要时间,并且可以保留代码。在android中,您可以考虑将此代码移动到异步任务并触发其他活动,以通过异步任务的onPostExecute中的处理程序运行它的功能。

答案 2 :(得分:1)

SqliteDatabase的insertOrThrow方法也返回一个long值,表示插入行的id。您还可以检查长值,如果long值为-1,则不插入行,但如果它的值不是-1,则成功插入行。