SQLITE事务:获取总计数

时间:2014-01-04 06:45:03

标签: android sqlite

我正在使用事务将记录插入我的数据库。你能告诉我这是否是获得总插入记录的正确方法(通过numrow返回)?此外,在下面的代码中,如果某些插入失败,它会继续下一次插入还是会退出(我没有在Catch块中使用endTransaction)?

int numrow = 0;
try{
            db.beginTransaction();
            for(mylibman cn : insertlist){
                ContentValues values = new ContentValues();
                values.put(KEY_LIBID, cn.getLibid());
                values.put(KEY_NAME, cn.getBookname());
                db.insertWithOnConflict(TABLE_NAME, null, values,SQLiteDatabase.CONFLICT_IGNORE);
                numrow++;
            }
            db.setTransactionSuccessful();
        }catch (Exception e) {

        } finally {
            db.endTransaction();
        }
        return numrow;

3 个答案:

答案 0 :(得分:1)

你应该像这样检查

    int numrow = 0;
    try{
                db.beginTransaction();
                for(mylibman cn : insertlist){
                    ContentValues values = new ContentValues();
                    values.put(KEY_LIBID, cn.getLibid());
                    values.put(KEY_NAME, cn.getBookname());
                    //do like this
                    long insertedId=db.insertWithOnConflict(TABLE_NAME, null, values,SQLiteDatabase.CONFLICT_IGNORE);
                    if(insertedId!=-1)
                    {
                          numrow++;

                    }

                }
                db.setTransactionSuccessful();
            }catch (Exception e) {

            } finally {
                db.endTransaction();
            }
            return numrow;

答案 1 :(得分:0)

您的代码也会计算被忽略的记录。

insertWithOnConflict返回插入记录的rowid,或-1,因此您必须检查:

if (db.insertWithOnConflict(TABLE_NAME, null, values,
                            SQLiteDatabase.CONFLICT_IGNORE) != -1)
    numrow++;

如果由于冲突而未插入记录,insertWithOnConflict函数不会抛出异常。但是,如果存在其他错误,例如未知列名或只读数据库, 抛出。

你不应盲目忽视异常;只需使用try / finally

db.beginTransaction();
try {
    for (...) {
        ...
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

答案 2 :(得分:0)

此处的答案不反映文件: "返回: 新插入行的行ID 或现有行的主键,如果输入参数“冲突算法”#39; = CONFLICT_IGNORE或-1如果有任何错误"

由于作者想知道插入的'列,两个答案都是错误的。插入的行数可以是0,因为它们已经存在。但是" CONFLICT_IGNORE"将使插入返回现有的主键,因此numrow将是您尝试过的行'插入并没有失败,但没有插入'。

您可能必须使用标记" SQLiteDatabase.CONFLICT_ABORT"或者" SQLiteDatabase.CONFLICT_FAIL"取决于你插入的内容和方式。

来源:http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insertWithOnConflict%28java.lang.String,%20java.lang.String,%20android.content.ContentValues,%20int%29