Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(6)

简介:

       Step 24. SQLiteCursor.getCount

      这个函数定义在frameworks/base/core/java/android/database/sqlite/SQLiteCursor.java文件中:
  1. public class SQLiteCursor extends AbstractWindowedCursor {  
  2.     ......  
  3.   
  4.     @Override  
  5.     public int getCount() {  
  6.         if (mCount == NO_COUNT) {  
  7.             fillWindow(0);  
  8.         }  
  9.         return mCount;  
  10.     }  
  11.   
  12.     ......  
  13. }  
      它里面的成员变量mCount的初始化为NO_COUNT,表示还没有去执行数据库查询操作,因此,还不知道它的值是多少,需要通过调用fillWindow函数来从数据据库中查询中,第三方应用程序所请求的数据一共有多少行。
 
      Step 25. QLiteCursor.fillWindow
      这个函数定义在frameworks/base/core/java/android/database/sqlite/SQLiteCursor.java文件中:
  1. public class SQLiteCursor extends AbstractWindowedCursor {  
  2.     ......  
  3.   
  4.     private void fillWindow (int startPos) {  
  5.         ......  
  6.   
  7.         mCount = mQuery.fillWindow(mWindow, mInitialRead, 0);  
  8.           
  9.         ......  
  10.     }  
  11.   
  12.     ......  
  13. }  
      注意,这里的成员变量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. public class SQLiteQuery extends SQLiteProgram {  
  2.     ......  
  3.   
  4.     /* package */ int fillWindow(CursorWindow window,  
  5.             int maxRead, int lastPos) {  
  6.         ......  
  7.         try {  
  8.             ......  
  9.             try {  
  10.                 ......  
  11.                 // if the start pos is not equal to 0, then most likely window is  
  12.                 // too small for the data set, loading by another thread  
  13.                 // is not safe in this situation. the native code will ignore maxRead  
  14.                 int numRows = native_fill_window(window, window.getStartPosition(), mOffsetIndex,  
  15.                     maxRead, lastPos);  
  16.   
  17.                 ......  
  18.                 return numRows;  
  19.             } catch (IllegalStateException e){  
  20.                 ......  
  21.             } catch (SQLiteDatabaseCorruptException e) {  
  22.                 ......  
  23.             } finally {  
  24.                 ......  
  25.             }  
  26.         } finally {  
  27.             ......  
  28.         }  
  29.     }  
  30.   
  31.     ......  
  32. }   
      这里我们可以看到,真正的数据库查询操作是由本地方法native_fill_window来执行的,它最终也是调用了sqlite的库函数来执行数据库查询的操作,这里我们就不跟进去了,对sqlite有兴趣的读者可以自己研究一下。这个函数执行完成之后,就会把从数据库中查询得到的数据的行数返回来,这个行数最终返回到Step 25中的SQLiteCursor.fillWindow函数,设置在SQLiteCursor类的成员变量mCount中,于是,下次再调用它的getCount函数时,就可以马上返回了。
 
      这一步执行完成之后,就回到前面的Step 14中,最终就把从Content Provider中查询得到的数据通过匿名共享内存返回给第三方应用程序了。
      至此,Android应用程序组件Content Provider在应用程序之间共享数据的原理就分析完成了,总的来说,它就是通过Binder进程间通信机制和匿名共享内存来实现的了。
      关于应用程序间的数据共享还有另外的一个重要话题,就是数据更新通知机制了。因为数据是在多个应用程序中共享的,当其中一个应用程序改变了这些共享数据的时候,它有责任通知其它应用程序,让它们知道共享数据被修改了,这样它们就可以作相应的处理。在下一篇文章中,我们将分析Android应用程序组件Content Provider的数据更新通知机制,敬请关注。




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967010,如需转载请自行联系原作者
目录
相关文章
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
892 64
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
2563 62
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
972 61
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
450 0
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
816 56
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
1126 5
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
544 3

热门文章

最新文章