Step 24.SQLiteCursor.getCount

这个函数定义在frameworks/base/core/java/android/database/sqlite/SQLiteCursor.java文件中:
  1. publicclassSQLiteCursorextendsAbstractWindowedCursor{
  2. ......
  3. @Override
  4. publicintgetCount(){
  5. if(mCount==NO_COUNT){
  6. fillWindow(0);
  7. }
  8. returnmCount;
  9. }
  10. ......
  11. }
它里面的成员变量mCount的初始化为NO_COUNT,表示还没有去执行数据库查询操作,因此,还不知道它的值是多少,需要通过调用fillWindow函数来从数据据库中查询中,第三方应用程序所请求的数据一共有多少行。 Step 25.QLiteCursor.fillWindow
这个函数定义在frameworks/base/core/java/android/database/sqlite/SQLiteCursor.java文件中:
  1. publicclassSQLiteCursorextendsAbstractWindowedCursor{
  2. ......
  3. privatevoidfillWindow(intstartPos){
  4. ......
  5. mCount=mQuery.fillWindow(mWindow,mInitialRead,0);
  6. ......
  7. }
  8. ......
  9. }
注意,这里的成员变量mWindow实际上是SQLiteCursor的父类AbstractWindowedCursor的成员变量,是在Step 23中设置的,它的访问权限为protected,因此,SQLiteCursor类可以直接访问它。真正的数据库查询操作是由SQLiteCursor类的成员变量mQuery来执行的,它的类型是SQLiteCursor,是前面的Step 22中创建的,它知道如何去把第三方应用程序请求的数据从数据库中提取出来。 Step 26.SQLiteCursor.fillWindow 这个函数定义在frameworks/base/core/java/android/database/sqlite/SQLiteQuery.java文件中:
  1. publicclassSQLiteQueryextendsSQLiteProgram{
  2. ......
  3. /*package*/intfillWindow(CursorWindowwindow,
  4. intmaxRead,intlastPos){
  5. ......
  6. try{
  7. ......
  8. try{
  9. ......
  10. //ifthestartposisnotequalto0,thenmostlikelywindowis
  11. //toosmallforthedataset,loadingbyanotherthread
  12. //isnotsafeinthissituation.thenativecodewillignoremaxRead
  13. intnumRows=native_fill_window(window,window.getStartPosition(),mOffsetIndex,
  14. maxRead,lastPos);
  15. ......
  16. returnnumRows;
  17. }catch(IllegalStateExceptione){
  18. ......
  19. }catch(SQLiteDatabaseCorruptExceptione){
  20. ......
  21. }finally{
  22. ......
  23. }
  24. }finally{
  25. ......
  26. }
  27. }
  28. ......
  29. }
这里我们可以看到,真正的数据库查询操作是由本地方法native_fill_window来执行的,它最终也是调用了sqlite的库函数来执行数据库查询的操作,这里我们就不跟进去了,对sqlite有兴趣的读者可以自己研究一下。这个函数执行完成之后,就会把从数据库中查询得到的数据的行数返回来,这个行数最终返回到Step 25中的SQLiteCursor.fillWindow函数,设置在SQLiteCursor类的成员变量mCount中,于是,下次再调用它的getCount函数时,就可以马上返回了。 这一步执行完成之后,就回到前面的Step 14中,最终就把从Content Provider中查询得到的数据通过匿名共享内存返回给第三方应用程序了。 至此,Android应用程序组件Content Provider在应用程序之间共享数据的原理就分析完成了,总的来说,它就是通过Binder进程间通信机制和匿名共享内存来实现的了。 关于应用程序间的数据共享还有另外的一个重要话题,就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。在下一篇文章中,我们将分析Android应用程序组件Content Provider的数据更新通知机制,敬请关注。

更多相关文章

  1. 使android应用程序不出现在应用管理中
  2. android中清空一个表。类似truncate table 表名 这样的功能 andr
  3. Android8.1添加MTP数据同步操作
  4. android - SAX解析XML数据
  5. Android笔记四 虚拟机Dalvik、Android各种java包功能、Android相

随机推荐

  1. Android事件分发机制详解:史上最全面、最
  2. Android的交叉编译工具
  3. Android程序员必看之Android六大优势
  4. 记录一下八款开源 Android(安卓)游戏引擎
  5. 关于自己Android开发的感想,怎样深入系统
  6. What is Android?
  7. Android应用程序窗口(Activity)的运行上下
  8. 在Android中创建和使用数据库
  9. 7种形式的Android(安卓)Dialog使用举例
  10. Android与linux的区别与联系