• 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数据库容易产生此异常,解决办法就是在统一的地方进行数据库的打开和关闭,比如在页面销毁时再关闭连接。

  • 相关阅读:
    学习笔记—二进制和精度问题
    学习笔记—Buffer的常用方法与实现
    学习笔记—Node中第三方模块
    学习笔记—npm的介绍与使用
    .NET中序列化(一)
    .NET中序列化(二)
    JavaScript在多浏览器下杂谈1for循环
    .NET中序列化(三)
    DLCB额度切分
    DLCB解决问题的思路
  • 原文地址:https://www.cnblogs.com/yjpjy/p/9407862.html
Copyright © 2020-2023  润新知