zoukankan      html  css  js  c++  java
  • SQLite相关异常

    SQLite的异常大多都和异常IO操作有关,这类异常通常在debug测试的时候难以发现通常和用户的操作有关系,根据我遇到的包括以下几种:

    1.No transaction is active

     这种情况通常是批量插入数据(for+insert)大量数据时会产生。因为android默认插入数据的时候默认一条语句就是一个事务,有多少数据就会进行多少次磁盘操作,而且不能保障所有数据能够同时插入。可以这样写

    try{
    
       for(String sql:sqls){
         
           db.execSQL(sql);
        }  
        //设置事务标识,结束事务时会提交事务
        db.setTransactionSuccessful(); 
    }catch (Exception e) {
        e.printStackTrace();
       }
    

      setTransactionSuccessful()这个方法在执行前,所有的execSQL都不会更新到数据库,当这个方法执行完后会一次性写入所有execSQL方法,数据同步更新到数据库。

    2.忘记关闭游标(Cursor window allocation of 2084 kb failed)

      这个异常是因为查询后忘记关闭cursor,内存泄漏多了就崩溃了,解决办法自然是手动关闭cursor;

    3.数据库被锁定(database is locked)

      当我们在不同的线程创建多个连接时,就会抛出这个异常,解决方法是把db做成一个单例对象,或者使用contentprovider

    4.试图打开已经关闭的对象 (attempt to reopen an already-closed object)

        这个问题实际上是3的延续,既然做成了单例,如果在不同的线程中创建多个连接,就会报当期的错误信息。频繁的操作SQlite数据库容易产生此异常,解决办法就是在统一的地方进行数据库的打开和关闭,比如在页面销毁时再关闭连接。

  • 相关阅读:
    iOS 基础复习
    iOS项目立项
    Cocos2d-JS项目之四:UI界面的优化
    Cocos2d-JS项目之三:使用合图
    Cocos2d-JS项目之二:studio基础控件的使用
    Cocos2d-JS项目之一:环境(IDE 运行js-tests、IDE 和 studio 统一工程)
    字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃
    cocos2dx 2.x 骨骼动画优化
    Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)
    [leetcode 周赛 160] 1240 铺瓷砖
  • 原文地址:https://www.cnblogs.com/yjpjy/p/9407862.html
Copyright © 2011-2022 走看看