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