赞
踩
调用数据库的方法如下,
- ContentResolver resolver = getContentResolver();
- 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方法如下,
- @Override
- public int delete(String callingPkg, Uri uri, String selection, String[] selectionArgs) {
- validateIncomingUri(uri);
- uri = getUriWithoutUserId(uri);
- if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) {
- return 0;
- }
- final String original = setCallingPackage(callingPkg);
- try {
- return ContentProvider.this.delete(uri, selection, selectionArgs);
- } finally {
- setCallingPackage(original);
- }
- }
ContentProvider的delete方法是一个抽象方法,由各个子类去实现,
public abstract int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs);
这样,就调用到了ContentProvider的delete方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。