http://blog.sina.com.cn/s/blog_6f14deb60100wd2n.html

总结一下Activity.startManagingCursor方法:

我们将获得的Cursor对象交与Activity 来管理,这样Cursor对象的生命周期便能与当前的Activity自动同步,省去了自己管理Cursor。

 
1.这个方法使用的前提是:游标结果集里有很多的数据记录。
所以,在使用之前,先对Cursor是否为null进行判断,如果Cursor != null,再使用此方法
 
2.如果使用这个方法,最后也要用stopManagingCursor()来把它停止掉,以免出现错误。
 
3.使用这个方法的目的是把获取的Cursor对象交给Activity管理,这样Cursor的生命周期便能和Activity自动同步,
省去自己手动管理。

转:

ContentProvider中,最重要的就是query操作。query根据输入返回一个符合条件的Cursor。这就可能出现以下几种情况:1. 查询成功,包含几个正确的结果;2. 查询失败,没有符合的结果;3. 输入错误, 触发了某个异常;4. 没能查询到结果,但无法确定是输入错误还是查询失败。第一种情况是我们最需要的,当然是需要正确维系的,而最后一种情况在大部分应用中应该不会出现(但在我的应用中会的*_#),而第二种第三种是比较常见的。

  经过我的测试,系统的ContentProvider维持这样的语义:如果是情况2,返回正常的Cursor,并且,其count为0,相当于empty cursor;如果是情况3,不抛出任何异常,返回null的Cursor。这样的话明明白白写出来是很好理解的,但由于没有官方的文档说明,在自定义的时候经常会误用。比如在某些情况下,用null表征查询失败,用抛出异常来描述错误的输入。

 返回empty cursor,如果是通过databasecursor自然会有db帮你维护,但是如果返回ArrayListCursor,MergeCursor或其他自定义的Cursor,就需要自己维系了。ArrayListCursor可以通过new ArrayListCursor(Columns, new ArrayList(){})来提供。其中Columns一定不为null。MergeCursor不能以new MergeCursor(new Cursor[]{})来创建,而需要通过new MergeCursor(new Cursor[]{aEmptyCursor, ...}来维系(其实很好理解,我呆了...)。自定义的Cursor也一定要提供生成empty cursor的方式。

  如果将ContentProvider作为一个单独的module来理解,不通过异常而是通过null来返回MS是有好处的。在module的出口吃 掉所有异常,虽然不能提供足够的信息(异常信息全部写入日志),但可能会使上层使用更简单。但在Android中,我并没有感觉到这一点。作为 ContentProvider的上层函数,ListActivity.managedQuery、 ListView.setListAdapter等,根本不能处理一个null的Cursor,在ListView中这会触发一个异常。更无语的是,当你 把一个null Cursor设置为manage的后。它不会立即抛异常,而是在OnFreeze等生命周期函数的时候,因无法处理null Cursor而抛出一个异常。这使得你根本无法在当地catch该异常,换句话,ListActivity的manageCursor根本是个无法使用的 函数。你必须用getContext().query()获得Cursor,然后判定该Cursor是否null,在进行 startManagingCursor进行绑定。这远不如直接用异常进行错误路径的处理来的统一和方便。

 当然,有些东西我们是不能改变的,只能去适应。对于自定义的cursor, ContentProvider,最重要的,是在无人造错误输入的情况下返回empty cursor,而不是null。至于使用null响应还是异常响应上,我个人觉得还是和系统同步为好,虽然别扭,但至少统一不容易有歧义。

 此外,ContentProvider还有很多细致的语义。比如返回的Cursor需要绑定一个URI,以便自动响应更新。自定义的更新需要支持deleteRow等操作语义等等。总之,我们需要更好的文档或更多经验文档,以便我们更好的爬上巨人的肩膀。

 PS:而上层的ListView,更是陷阱重重。首先绑定到ListView的Cursor必须有_id项,否则会有异常抛出。如果做过.net的开 发,这一点是可以想到的,但是,这种问题应该在文档中写明。另外,在ListView中,如果你不绑定一个数据源,你一定不能在layout中添加涉及内 容的属性。比如android:height="wrap_content",这会在onMeasure的时候抛出异常。

最新文章

  1. Nginx搭建https服务器
  2. Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释
  3. 获取ip ,百度地图坐标点 和 在 后台调用 url()
  4. VIM学习笔记
  5. Linux下php安装phpredis
  6. 【转】centOS中mysql一些常用操作
  7. .Net程序员学习Linux(一)
  8. iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装
  9. javascript 切换动画
  10. LEK-Introduction
  11. oracle控制台命令
  12. [转] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
  13. ESP-IDF版本更新说明(V2.1版)转自github(https://github.com/espressif/esp-idf/releases/)
  14. 听 Fabien Potencier 谈Symfony2 之 《What is Dependency Injection ?》
  15. CentOS7创建本地YUM源的三种方法
  16. Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
  17. 【Treap 例题】神秘岛(island)
  18. Linux下使用Supervisor来管理维护程序-详解
  19. pandas 里面对nan的判断
  20. Mycat问题总结

热门文章

  1. poj 3667 Hotel
  2. 【UVALive - 3211】Now or later (二分+2-SAT)
  3. 孤陋寡闻又一遭:ReportEvent API函数(有微软Service官方例子为例)
  4. DestroyWindow
  5. 【转】Linux下svn的常用工作流程
  6. Perfect Squares——Leetcode
  7. CSU 1507 超大型LED显示屏 第十届湖南省赛题
  8. UVA10054 The Necklace
  9. Sicily1151:魔板搜索及优化
  10. DateADD日期Sql