当前位置:   article > 正文

ContentProvider 源码分析---之三_syncadapter源码分析

syncadapter源码分析

3, ContentProvider实现

调用数据库的方法如下,

  1. ContentResolver resolver = getContentResolver();
  2. Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,•••

实际步骤如下,

1,调用getContentResolver方法获取ContextImpl的内部类ApplicationContentResolver对象;

2,通过ApplicationContentResolver对象获取目标ContentProvider的Transport对象(IContentProvider对象).

如果目标ContentProvider已启动,直接在AMS中的变量查询获取并返回;

如果目标ContentProvider未启动,但所在进程已创建,则安装ContentProvider;

如果目标ContentProvider所在进程未创建,则先创建进程。

3,通过IContentProvider对象调用增删改查方法。

insert/delete/update/query四个方法调用流程图完全相同,以delete为例论述,

客户端调用目标ContentProvider的delete方法其实就是Transport的delete方法,

Transport的delete方法调用流程图如下,


Transport的delete方法如下,

  1. @Override
  2. public int delete(String callingPkg, Uri uri, String selection, String[] selectionArgs) {
  3. validateIncomingUri(uri);
  4. uri = getUriWithoutUserId(uri);
  5. if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) {
  6. return 0;
  7. }
  8. final String original = setCallingPackage(callingPkg);
  9. try {
  10. return ContentProvider.this.delete(uri, selection, selectionArgs);
  11. } finally {
  12. setCallingPackage(original);
  13. }
  14. }

ContentProvider的delete方法是一个抽象方法,由各个子类去实现,

public abstract int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs);

这样,就调用到了ContentProvider的delete方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/892135
推荐阅读
相关标签
  

闽ICP备14008679号