0

我正在从网络上获取有关项目的信息,我希望我的应用程序检查某些行是否存在。如果它们确实存在,那么应用程序应该更新这些行,否则它应该创建新行:

try {
    mDb.execSQL("UPDATE ["
    + ParseReciverAddList.tableName
    + "] SET purchased = " + pCheck
    + " WHERE id =" + (thisId));
    mDb.execSQL("UPDATE ["
    + ParseReciverAddList.tableName
    + "] SET name = '" + (PName)
    + "' WHERE id =" + (thisId));
    mDb.execSQL("UPDATE ["
    + ParseReciverAddList.tableName
    + "] SET quantity = '" + (pQuantity)
    + "' WHERE id =" + (thisId));
    Log.d("p", "e");
} catch (Exception e) {
    Log.d("p", "ne");
    mDb.execSQL("INSERT INTO ["+ParseReciverAddList.tableName+"] VALUES ("+thisId+","+pCheck+", '"+PName+"','"+pQuantity+"');");
}

我想我会尝试更新它,如果它抛出Exception那么这意味着行不存在并且它将创建它。

但是,我遇到了一个问题:即使该行不存在,它也不会抛出Exception. catch关于为什么在行已经存在时它不触发子句的任何想法?

4

1 回答 1

1

但是,我遇到了一个问题:即使该行不存在,它也不会抛出异常。关于为什么当行已经存在时它不触发 catch 子句的任何想法?

原因是仅在您的字符串无效的情况下才会execSQL()抛出。但是您的问题是,如果行不存在,则不会应用简单的语句,但这并不意味着String 不正确。SQLExceptionSQLUPDATESQL

解决方案是使用例如update()返回受影响行数的 API 方法,如果它返回 0,则只需执行INSERT

伪代码:

int rowsAffected = db.update("table", values, "id = ?", 
                   new String[] {String.valueOf(thisId)});
if (rowsAffected == 0) {
   // perform insert
}
于 2013-03-28T14:14:23.457 回答