异常:android.database.StaleDataException: Attempted to access a cursor after it has been closed

  • 1.老规矩,贴报错信息:

    Unable to resume activity {com.hy.gzh/com.hy.gzh.ui.activity.workcircle.SendDynamicActivity}: 
    android.database.StaleDataException: Attempted to access a cursor after it has been closed.
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3035)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3064)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5314)
    ...
    
    Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
    at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
    at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133)
    at android.database.CursorWrapper.requery(CursorWrapper.java:186)
    ...
    
  • 2.分析:

    • 1.根据报错信息的提示: “是由于我尝试访问已经关闭的cursor而报的异常”,在网上查找了相关异常的 资料,最后经过测试,终于确定了该异常的发生原因以及解决方案!

    • 2.那么首先截图下某位大神的博客,再附上其博客网址:

    这里写图片描述

    参考的博客网址:http://blog.csdn.net/lovexieyuan520/article/details/12837899
    http://hzhuzhiyu.blog.163.com/blog/static/167972388201491143958532/

  • 3.解决:

    • 1.首先定位错误: “cursor.close();”具体在相关操作的那部分代码里引用了;
    • 2.将 “cursor.close()” 改为如下形式;

       if(Build.VERSION.SDK_INT<14){
          //在android 4.0及其以上的版本中,Cursor会自动关闭,不需要用户自己关闭
          cursor.close();
       }
      
    • 3.但是又在试验中发现了另一问题.
      我们查询数据库的时候,是不是可以使用如下两个Api进行查询

      1.context.managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
                           videoColumns,null, null, null);
      -------------------------------------------------------------------
      2.viedoCursor = context.getContentResolver().query
        (MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoColumns);
      

      那么问题就来了,我发现在使用上面第2个Api查询数据库的时候,在 “cursor.close();” 不做判断版本是否小于14的操作,并不会发生异常,而使用第一个Api就发生异常了,这我就郁闷了

  • 4.解惑:后来看到一篇博客这样写着

    截图:
    ![这里写图片描述](https://img-blog.csdn.net/20160704224108981)
    
    博客网址:http://www.cnblogs.com/yushiro/archive/2013/05/17/3084278.html
    
  • 5.总结:

    • 1.注意查询数据库的这两个Api的正确close方式;
    • 2.关于cursor,之后有时间的话会对其充分的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值