广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    深入Android SQLite 事务处理详解

    2018-04-07 07:49:25 次阅读 稿源:互联网
    广告

    应用程序初始化时需要批量的向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语句在同一个事务中执行。

    Java代码
    代码如下:

    //银行账户事务测试 
    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(); 
        } 
    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告