我正在使用事务将记录插入我的数据库。你能告诉我这是否是获得总插入记录的正确方法(通过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;
答案 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"取决于你插入的内容和方式。