zoukankan      html  css  js  c++  java
  • 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多毫秒,以后对于上万条数据也是非常之快的。

     

  • 相关阅读:
    ThinkPHP中pathinfo模式与URL重写
    JS分割字符串并放入数组的函数
    js解决弹窗问题实现班级跳转DIV示例
    javascript客户端遍历控件与获取父容器对象
    Apache 虚拟目录和默认首页的设置
    linux Apache CGI 安装配置
    apache与和mysql重启命令
    带你从零学ReactNative开发跨平台App开发(三)
    带你从零学ReactNative开发跨平台App开发(一)
    C#/Net定时导出Excel并定时发送到邮箱
  • 原文地址:https://www.cnblogs.com/awkflf11/p/9200769.html
Copyright © 2011-2022 走看看