Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(4)
16lz
2021-01-24
Step 16. CursorWindow.native_init 这个函数定义在frameworks/base/core/jni/android_database_CursorWindow.cpp文件中,对应的函数为native_init_memory函数:
- staticJNINativeMethodsMethods[]=
- {
- ......
- {"native_init","(Landroid/os/IBinder;)V",(void*)native_init_memory},
- };
- staticvoidnative_init_memory(JNIEnv*env,jobjectobject,jobjectmemObj)
- {
- sp<IMemory>memory=interface_cast<IMemory>(ibinderForJavaObject(env,memObj));
- ......
- CursorWindow*window=newCursorWindow();
- ......
- if(!window->setMemory(memory)){
- ......
- }
- ......
- SET_WINDOW(env,object,window);
- }
- boolCursorWindow::setMemory(constsp<IMemory>&memory)
- {
- mMemory=memory;
- mData=(uint8_t*)memory->pointer();
- ......
- mHeader=(window_header_t*)mData;
- //Makethewindowread-only
- ssize_tsize=memory->size();
- mSize=size;
- mMaxSize=size;
- mFreeOffset=size;
- ......
- returntrue;
- }
- publicabstractclassContentProviderimplementsComponentCallbacks{
- ......
- classTransportextendsContentProviderNative{
- ......
- publicIBulkCursorbulkQuery(Uriuri,String[]projection,
- Stringselection,String[]selectionArgs,StringsortOrder,
- IContentObserverobserver,CursorWindowwindow){
- ......
- Cursorcursor=ContentProvider.this.query(uri,projection,
- selection,selectionArgs,sortOrder);
- ......
- returnnewCursorToBulkCursorAdaptor(cursor,observer,
- ContentProvider.this.getClass().getName(),
- hasWritePermission(uri),window);
- }
- ......
- }
- ......
- }
- publicclassArticlesProviderextendsContentProvider{
- ......
- @Override
- publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){
- SQLiteDatabasedb=dbHelper.getReadableDatabase();
- SQLiteQueryBuildersqlBuilder=newSQLiteQueryBuilder();
- Stringlimit=null;
- switch(uriMatcher.match(uri)){
- ......
- caseArticles.ITEM_POS:{
- Stringpos=uri.getPathSegments().get(1);
- sqlBuilder.setTables(DB_TABLE);
- sqlBuilder.setProjectionMap(articleProjectionMap);
- limit=pos+",1";
- break;
- }
- ......
- }
- Cursorcursor=sqlBuilder.query(db,projection,selection,selectionArgs,null,null,TextUtils.isEmpty(sortOrder)?Articles.DEFAULT_SORT_ORDER:sortOrder,limit);
- ......
- returncursor;
- }
- ......
- }
- publicclassSQLiteQueryBuilder
- {
- ......
- publicCursorquery(SQLiteDatabasedb,String[]projectionIn,
- Stringselection,String[]selectionArgs,StringgroupBy,
- Stringhaving,StringsortOrder,Stringlimit){
- ......
- Stringsql=buildQuery(
- projectionIn,selection,groupBy,having,
- sortOrder,limit);
- ......
- returndb.rawQueryWithFactory(
- mFactory,sql,selectionArgs,
- SQLiteDatabase.findEditTable(mTables));
- }
- ......
- }
- publicclassSQLiteDatabaseextendsSQLiteClosable{
- ......
- publicCursorrawQueryWithFactory(
- CursorFactorycursorFactory,Stringsql,String[]selectionArgs,
- StringeditTable){
- ......
- SQLiteCursorDriverdriver=newSQLiteDirectCursorDriver(this,sql,editTable);
- Cursorcursor=null;
- try{
- cursor=driver.query(
- cursorFactory!=null?cursorFactory:mFactory,
- selectionArgs);
- }finally{
- ......
- }
- returncursor;
- }
- ......
- }
更多相关文章
- C语言函数的递归(上)
- android实时监听网络状态并在断网的情况下打开网络设置
- Android中的几种网络请求方式
- Android多媒体学习六:利用Service实现背景音乐的播放
- Android(安卓)执行 FFmpeg 命令
- Android(安卓)Handler removeMessages引发postDelayed失效的问题
- android loader用法
- Logger详解(二)
- Android(安卓)HTTP通讯