深入Android SQLite 事务处理详解

时间:2023-07-17 08:32:17 

应用程序初始化时需要批量的向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(); 
    } 
}


标签:Android,SQLite,事务处理
0
投稿

猜你喜欢

  • 解决Java原生压缩组件不支持中文文件名乱码的问题

    2021-07-29 22:39:38
  • Android实现计步器功能

    2023-12-24 14:06:21
  • spring boot如何使用AOP统一处理web请求

    2023-05-16 14:15:11
  • java异常与错误处理基本知识

    2023-11-25 10:44:59
  • 基于C#实现屏幕取色器的示例详解

    2021-06-26 08:58:05
  • Gradle的缓存路径修改的四种方法(小结)

    2021-11-09 11:05:51
  • c#如何使用 XML 文档功能

    2023-12-25 03:44:33
  • 如何自己实现Android View Touch事件分发流程

    2023-10-19 14:07:30
  • JAVA回顾:封装,继承,多态

    2021-09-26 20:17:59
  • Spring的事务机制实例代码

    2021-09-11 07:46:23
  • Java 爬虫服务器被屏蔽的解决方案

    2022-11-06 13:23:46
  • Asp.Net中MVC缓存详解

    2023-06-08 13:44:45
  • java日期工具类实例分享

    2023-05-17 17:50:40
  • SpringMVC实现文件上传与下载

    2021-11-02 11:53:38
  • Spring Boot整合ElasticSearch实现多版本兼容的方法详解

    2021-09-20 18:06:22
  • Java实现获取内网的所有IP地址

    2023-01-01 07:48:56
  • Android开发手册Chip监听及ChipGroup监听

    2023-03-13 01:16:36
  • C#网站生成静态页面的实例讲解

    2021-11-01 16:33:08
  • 关于Spring中的三级缓存解析

    2022-08-20 15:31:06
  • 详解Spring Boot读取配置文件与配置文件优先级

    2022-03-23 13:14:23
  • asp之家 软件编程 m.aspxhome.com