Sqlite之事务
12.Sqlite事务介绍:
11.android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
==========
12.Sqlite事务介绍:
应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败,后续还得删除。太麻烦)
解决方法:添加事务处理,把5000条插入作为一个事务
我们使用SQLite的事务进行控制:
db.beginTransaction(); //手动设置开始事务
try{
//批量处理操作
for(Collection c:colls){
insert(db, c);
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
//在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
}catch(Exception e){
MyLog.printStackTraceString(e);
}finally{
db.endTransaction(); //处理完成
}
一、使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,
如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功,
则所有从beginTransaction()开始的操作都会被提交,如果没有调用setTransactionSuccessful()方法则回滚事务。
二、使用例子如下:下面两条SQL语句在同一个事务中执行。
//银行账户事务测试
public void payment()
{
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//开启事务
db.beginTransaction();
try
{
db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});
db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});
//设置事务标志为成功,当结束事务时就会提交事务
db.setTransactionSuccessful();
}
catch(Exception e){
throw(e);
}
finally
{
//结束事务
db.endTransaction();
}
}
11.android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
原地址 :http://www.cnblogs.com/wangmars/p/3914090.html
SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中的操作方式几乎和我们接触的数据库不多,甚至只有几百K的他自然会被需求者青睐,下面讲一下在这样的轻型数据库中怎么对他进行一些读写操作。
之前做选择联系人的时候出现如果一个手机里联系人超过2000的话,往数据库里面插入会非常耗时,不同的手机存储的条数不同,这个存储的数量和手机的内存有很大的关系,往往取决于手机内存,下面对于数据量大的情况来写一下sqlite的批量查询。
SqLite 插入数据有几种
第一种 :由于InsertHelper 这个类在android api17已经被废弃了,所以要是基于 之前开发的可以使用
InsertHelper ih = new InsertHelper(db, "表名");
db.beginTransaction();
final int 列1= ih.getColumnIndex("列1");
final int 列2 = ih.getColumnIndex("列2");
try {
for (Station s : busLines) {
ih.prepareForInsert();
ih.bind(列1, 对应的值);
ih.bind(列2, 对应的值);
ih.execute();
}
db.setTransactionSuccessful();
} finally {
ih.close();
db.endTransaction();
db.close();
}
第二种 :
同样在 SQLiteDatabase 中
public void inertOrUpdateDateBatch(List<String> sqls) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
for (String sql : sqls) {
db.execSQL(sql);
}
// 设置事务标志为成功,当结束事务时就会提交事务
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 结束事务
db.endTransaction();
db.close();
}
}
第三种:SQLiteDatabase db.insert("table_name", null, contentValues) 中也可以批量插入
public void insertData(插入数据){
db.beginTransaction(); // 手动设置开始事务
for (ContentValues v : list) {
db.insert("表名", null, v);
}
db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
db.endTransaction(); // 处理完成
db.close()
}
第四种 : SQLiteStatement 个人比较喜欢用这种方式,对数据的处理看的很清楚明了
String sql = "insert into表名(对应的列) values(?)";
SQLiteStatement stat = db.compileStatement(sql);
db.beginTransaction();
for (数据集) {
//循环所要插入的数据
}
db.setTransactionSuccessful();
db.endTransaction();
db.close();
总结: 以上的几种方式都用到了数据库中的事务这个东西,sqlite语句在其中只会走一次,其他的就是数据循环到数据库中的对象里,这样比以前用对象插入,再用for在外围循环快的不知道多少倍,之前插入2000多条数据300多毫秒,以后对于上万条数据也是非常之快的。
Sqlite之事务的更多相关文章
- sqlite的事务和锁,很透彻的讲解 【转】
原文:sqlite的事务和锁 http://3y.uu456.com/bp-877d38906bec097sf46se240-1.html 事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整 ...
- sqlite的事务
好久没用数据库,知识都忘了,之前用sqlite 逐行insert数据,发现这性能实在是太坑,10w条数据,插入大约花了100来分钟. 后来发现还有事务这么一个东西,可以大幅度降低对io的操作,测试插入 ...
- iOS sqlite 使用事务操作数据库
业务层代码: //将解析的更新人员数据批量同步到数据库 +(void)operateCompUsers:(NSMutableArray*)operateCompUsers { sqliteHelper ...
- SQLite使用事务更新—by command
public void SaveToDB(DataTable dt) { /* todo:sqlite没有提供批量插入的机制,需要通过事务处理 更新所有数据 * http://www.cnblogs. ...
- SQLite使用事务
关键代码 SQLiteDatabase db = myDataHelper.getWritableDatabase(); // 开启事务 db.beginTransaction(); try{ db. ...
- Android入门(十二)SQLite事务、升级数据库
原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...
- SQLite事务管理
事务管理对数据库一致性是至关重要的.数据库实现ACID属性以确保一致性.SQLite依赖于本地文件锁和页日志来实现ACID属性.SQLite只支持扁平事务,并不支持事务嵌套和保存点能力. 1.1 事务 ...
- C# Sqlite事务
在 C#中执行Sqlite数据库事务有两种方式:Sql代码和C#代码 1.Sql代码: BEGIN… COMMIT /ROLLBACK 2.C#代码: using (SQLiteConnection ...
- Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)
SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.例如:向数据库中插入100万条数 ...
随机推荐
- 【LeetCode】不同路径
如图,m × n 的网格的左上角作为起点,每次只能向右或向下移动一格,最终要到达右下角.求有多少条可能的路径. m,n 最大取 100. 我的想法是递归,分分钟实现 int uniquePaths(i ...
- css3-盒模型display:-webkit-box;的使用
提到移动布局不得不提到盒模型display:-webkit-box;这个属性,在移动布局中浮动已经不在重要,相反自适应成为主要的需求,所以display:-webkit-box;变得尤为重要. box ...
- 操作系统の实验四 windows中线程的创建和同步控制
摘要: 1.创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTIBUTES lpSemaphoreAttributes, LONG lInitialCount; ...
- 关于数据安全RSA,MD5,TOKEN
网络上明文传输时 1.数据可能被窃取:2.数据可能被篡改:3.数据被泄露 如何解决: 1.数据被窃取是由于数据能随意的被拿到,且能够被识别.可以有2个方式解决 a.使数据不能随意被获取: 使用toke ...
- 还是畅通工程,最小生成树kruskal
题目描述: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...
- mpvue 转小程序实践总结
介绍 Mpvue 是一个使用 Vue.js 开发小程序的前端框架. 基础介绍 框架基于 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序 ...
- 阿里的maven镜像仓库,eclipse中使用maven下载jar包的时候提升速度
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> & ...
- Django App(六) Customing Admin Form
这一篇主要是呼应第二篇时留下来的一个问题,就是如何自定义默认app admin下的Form 1.绑定数据实体 通过第二篇的努力,已经完成了数据实体到数据库的映射,可以将界面的更改保存到数据库,我们建 ...
- 使用pip命令自动生成项目安装依赖清单
Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...
- HBase和Phoneix使用示例
HBase操作 基本操作 创建表 Examples: hbase> create 't1', {NAME => 'f1', VERSIONS => 5} hbase> crea ...