Android中,对SQLite的‘批处理’操作
来源:互联网 发布:大恒加密软件破解 编辑:程序博客网 时间:2024/05/17 02:51
使用execSQL进行批处理插入
今天学习了一下如何更加高效的执行对SQLite的插入操作
注:用的是真机测试
我们使用SQLiteDatabase的insert方法和execSQL分别进行试验
首先是insert方法:
public boolean insert(String table, ContentValues values) { if (values == null || values.size() == 0) { return false; } db = helper.getWritableDatabase(); long count = db.insert(table, null, values); return count > 0; //count >0 就说明插入了数据 }
接下来是测试数据:
UserDAO userDAO = new UserDAO(mContext); ContentValues values = new ContentValues(); values.put(TbUserColumn.PASSWORD, "password"); long time1 = System.currentTimeMillis(); Log.i(TAG, "-------->>>非批处理插入操作开始执行:" + time1); for (int i = 0; i < 1000; i++) { values.put(TbUserColumn.USERNAME, "demo_user" + i); userDAO.insert(TbUserColumn.TABLE_NAME, values); } long time2 = System.currentTimeMillis(); Log.i(TAG, "-------->>>非批处理插入操作执行完毕:" + time2); Log.i(TAG, "-------->>>非批处理插入操作执行时间为:" + (time2 - time1)); List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null); Log.i(TAG, "-------->>>执行数据后的数量为:" + list.size());
下面就是执行的结果了:
数据库一开始是空的,如果获取的数据是1000条,说明我们就全部插入成功了
通过这张图片,可以知道,插入一千条数据,需要11.5秒,这太耗时间了。
接下来我们再用execSQL方法测试一下插入一千条数据需要多少时间
先将数据库文件删除,再进行测试。
首先是简单封装的方法
public void execSQLByBatch(List<String> sqls) { if (sqls == null || sqls.isEmpty()) { return; } try { db = helper.getWritableDatabase(); db.beginTransaction(); for (String sql : sqls) { db.execSQL(sql); } db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } }
接下来是测试数据
long startTime = System.currentTimeMillis(); Log.i(TAG, "-------->>>批处理插入操作开始组装数据"); List<String> sqls = new ArrayList<>(); for (int i = 0; i < 1000; i++) { String sql = "INSERT INTO tb_user(userName,password) VALUES('" + i + "_user', 'password" + i + "')"; sqls.add(sql); } long entTime = System.currentTimeMillis(); Log.i(TAG, "-------->>>批处理操作组装数据完毕,所花时间为:" + (entTime - startTime)); startTime = System.currentTimeMillis(); Log.i(TAG, "-------->>>批处理操作开始执行:" + startTime); userDAO.execSQLByBatch(sqls); entTime = System.currentTimeMillis(); Log.i(TAG, "-------->>>批处理操作执行完毕:" + (entTime - startTime)); List<Map<String, Object>> list = userDAO.query("SELECT * FROM tb_user", null); Log.i(TAG, "-------->>>获取数据的条数:" + list.size());
最后就是结果图了:
使用execSQL进行批量操作,插入一千条数据也就只用了0.5秒的时间,相较insert方法,速度快了有 23 倍了 所以在进行批处理操作的时候,不妨使用这个方法。
但是测试这个方法的时候,另外试了下,插入主键已存在的数据,那么会导致全部的数据都无法插入,是全部的数据。
可能是因为 db.setTransactionSuccessful();最后提交事务的时候,检查了是否插入有sql语句执行失败了,如果失败了,就不提交事务了。(猜测而已,找个时间在测试一下)
1 0
- Android中,对SQLite的‘批处理’操作
- android中SQLite的操作
- xUtils3中对Sqlite数据库的操作
- xUtils3中对Sqlite数据库的操作
- xUtils3中对Sqlite数据库的操作
- Android中结合OrmLite for android组件对SQLite的CRUD(增删改查)操作实例
- Android中结合OrmLite for android组件对SQLite的CRUD(增删改查)操作实例
- Android中结合OrmLite for android组件对SQLite的CRUD(增删改查)操作实例
- Android中结合OrmLite for android组件对SQLite的CRUD(增删改查)操作实例
- Android中对Sqlite的管理工具
- Android中对Sqlite的查询更新操作,能实现外键约束吗?
- android中SQLite数据库的操作
- android中SQLite数据库的操作
- Android中SQLite的简单crud操作
- Android中SQLite事务的操作
- Android中关于SQLite的操作
- Android中sqlite的一些操作命令
- 关于android SQLite 的insert操作对类型 REAL影响
- modbus 资源
- 平均值不等式证明(数学归纳法)
- c++ 中 pair 的 使用方法
- Android通用流行框架大全
- 解决Hexo博客的ERROR Process failed: layout/_partial/.DS_Store
- Android中,对SQLite的‘批处理’操作
- 存储班长信息的学生类(2)
- AFNetworking 2.0 新特性讲解之AFHTTPSessionManager
- 【CodeForces】C. Drazil and Factorial
- drawable包对应手机分辨率,像素密度,dp,dip,sp,px,pt简单分析
- scala——traits
- 代码训练营——TreeSet比较器
- Android Studio使用OpenCV的配置方法
- mvware虚拟机安装ubuntu