向后台代码请求了五百多条数据,发现插入完成需要5秒
原来代码:
public long insert(List<DBNFC> infoList) {
//先清除再更新
db.execSQL("DELETE FROM " + TABLE_NAME + ";");
long result = -1;
for (int i = 0; i < infoList.size(); i++) {
DBNFC dbnfc = infoList.get(i);
ContentValues cv = new ContentValues();
cv.put("card_no", dbnfc.card_no);
cv.put("card_status", dbnfc.card_status);
cv.put("rowid", dbnfc.rowid);
result = db.insert(TABLE_NAME, "", cv);
// 添加成功则返回行号,添加失败则返回-1
if (result == -1) {
return result;
}
}
return result;
}
存在问题:
-
逐行插入: 循环内部使用
db.insert(TABLE_NAME, "", cv);
逐行插入数据,这会导致频繁的数据库操作和事务开销,特别是在大量数据的情况下。 -
未使用事务: 在循环中没有使用事务来封装插入操作,这意味着每次插入都会开启一个新的数据库事务,增加了数据库操作的开销。
修改后:
// 往该表添加多条记录
public long insert(List<DBNFC> infoList) {
long result = -1;
// 开启事务
db.beginTransaction();
try {
// 清除表数据
db.execSQL("DELETE FROM " + TABLE_NAME + ";");
// 构建要插入的数据
List<ContentValues> contentValuesList = new ArrayList<>();
for (int i = 0; i < infoList.size(); i++) {
DBNFC dbnfc = infoList.get(i);
ContentValues cv = new ContentValues();
cv.put("card_no", dbnfc.card_no);
cv.put("card_status", dbnfc.card_status);
cv.put("rowid", dbnfc.rowid);
contentValuesList.add(cv);
}
// 批量插入数据
for (ContentValues cv : contentValuesList) {
result = db.insert(TABLE_NAME, "", cv);
if (result == -1) {
break;
}
}
// 标记事务成功并提交
db.setTransactionSuccessful();
} finally {
// 结束事务
db.endTransaction();
}
return result;
}
结论:事务的使用在数据库操作中是非常重要的,因为它可以保证数据的完整性和一致性,并且可以显著提高插入大量数据时的性能