事务处理应用:很多时候我们需要批量的向Sqlite中插入大量数据时,单独的使用添加方法导致应用响应缓慢, 因为sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。
插入三千条数据对比
方法一:
不优化,直接一条一条插入(耗时:20s左右)
try {
for (Area area : areas) {
Cursor cursor = null;
ContentValues cv;
cv = new ContentValues();
cv.put(TArea.CODE, area.getCode());
cv.put(TArea.CREATTIME, area.getCreatTime());
cv.put(TArea.FULLSPELL, area.getFullSpell());
cv.put(TArea.NAME, area.getName());
cv.put(TArea.SCOPE, area.getScope());
cv.put(TArea.SINGLESPELL, area.getSingleSpell());
cv.put(TArea.PARENT, area.getParent());
cursor = DbHelper.getInstance(context).query(TArea.TNAME, " where " + TArea.ID + "='" + area.getId() + "'");
if (cursor.getCount() == 0) {
DbHelper.getInstance(context).insert(TArea.TNAME, null, cv);
} else {
DbHelper.getInstance(context).update(TArea.TNAME, cv, TArea.ID + "=?", new String[]{String.valueOf(area.getId())});
}
cursor.close();
}
} catch (Exception e) {
return false;
}
方法二:
开事务(耗时:0s)
SQLiteDatabase db = DbHelper.getInstance(context).getWritableDatabase();
try {
// 如果该数据库表已经存在,先删掉
String dropSql = "DROP TABLE IF EXISTS Area";
db.execSQL(dropSql);
// 重新创建数据库表
String createSql = "CREATE TABLE IF NOT EXISTS Area(id INTEGER PRIMARY KEY, code TEXT, creatTime TEXT, fullspell TEXT, name TEXT, scope TEXT, singleSpell TEXT, parent TEXT)";
db.execSQL(createSql);
// 开启事务
db.beginTransaction();
// 往表名为"Area"的表里的code, creatTime, fullspell...等字段“开事务”批量“合并”插入
String sql = "INSERT INTO Area(code, creatTime, fullspell, name, scope, singleSpell, parent) VALUES(?, ?, ?, ?, ?, ?, ?)";
for (Area area : areas) {
db.execSQL(sql, new String[]{area.getCode(), String.valueOf(area.getCreatTime()),
area.getFullSpell(), area.getName(), area.getScope(), area.getSingleSpell(), area.getParent()});
}
//设置事务标志为成功,当结束事务时就会提交事务
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
// 结束事务
db.endTransaction();
}
注意:
1.sqlite没有truncate,要清空表数据,只好先删表,再建表。
2.sqlite3数据库中并不支持bool型数据
3.不能直接插入多条记录,参考这里
INSERT INTO 'tablename' ('column1') VALUES
('val1'),
('val2'),
('val2'),
('val2');
需要转换成
public void diff_date(View v){
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );
String insertRows = "INSERT INTO 'tablename' ('column1') VALUES";
String date_in = sdf.format( dateAndTime .getTime() );
String date_out = sdf.format( dateAndTime1.getTime() );
int differenza_date = Days.daysBetween(new DateTime(date_in), new DateTime(date_out)).getDays();
for(int i=1 ; i < differenza_date ; i++)
{
// increase i day each time and save it in string
insertRows += "("+increasedDate+"),"
}
// and here insert into database
db.execSQL(insertRows)
}