zoukankan      html  css  js  c++  java
  • Android 学习心得(3)——SQLite事务

    应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。

    而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败,后续还得删除。太麻烦)

    解决方法:

    添加事务处理,把5000条插入作为一个事务


    我们使用SQLite的事务进行控制:


            
     1 db.beginTransaction();  //手动设置开始事务
     2  
     3 
     4         try{
     5 
     6             //批量处理操作
     7 
     8             for(Collection c:colls){
     9 
    10                 insert(db, c);
    11 
    12             }
    13 
    14             db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
    15 
    16 //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作
    17 
    18            }catch(Exception e){
    19 
    20                MyLog.printStackTraceString(e);
    21 
    22            }finally{
    23 
    24                db.endTransaction(); //处理完成
    25 
    26            }
    27 
    28  


    一、使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功,则所有从beginTransaction()开始的操作都会被提交,如果没有调用setTransactionSuccessful() 方法则回滚事务。

    二、使用例子如下:下面两条SQL语句在同一个事务中执行。

    Java代码

     1 //银行账户事务测试  
     2 public void payment()  
     3 {  
     4     SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
     5     //开启事务  
     6     db.beginTransaction();  
     7     try  
     8     {  
     9         db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});  
    10         db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});  
    11         //设置事务标志为成功,当结束事务时就会提交事务  
    12         db.setTransactionSuccessful();  
    13     }  
    14    catch(Exception e){
    15         throw(e);
    16     }
    17     finally  
    18     {  
    19         //结束事务  
    20         db.endTransaction();  
    21     }  
    22 } 
    本文来自脚本之家http://www.jb51.net/article/36645.htm

     ————————————————————————————————————————————————————————————————

  • 相关阅读:
    [BZOJ3751] [NOIP2014] 解方程 (数学)
    [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
    [BZOJ4034] [HAOI2015] T2 (树链剖分)
    [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)
    [BZOJ1088] [SCOI2005] 扫雷Mine
    [BZOJ1004] [HNOI2008] Cards (Polya定理)
    [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
    [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)
    [BZOJ1059] [ZJOI2007] 矩阵游戏 (二分图匹配)
    BZOJ2626: JZPFAR
  • 原文地址:https://www.cnblogs.com/lingzhishitu/p/4381813.html
Copyright © 2011-2022 走看看