Android(安卓)ContentProvider的使用和理解
ContentProvider是Android中跨进程数据交换的重要类,Android为数据交换提供了一个标准ContentProvider.
那么应该如何完整实现开发一个contentProvider呢
1、首先需要定义自己的ContentProvider,该类需要继承Android提供的ContentProvider的基类
2、需要在AndroidManifest.xml文件中注册这个ContentProvider
1、子类
import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;public class DictProvider extends ContentProvider { String TAG = "=======TAG=====" ; @Override public boolean onCreate() { Log.v(TAG,"onCreate"); return false; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { Log.v(TAG,"query"); return null; } @Nullable @Override public String getType(@NonNull Uri uri) { Log.v(TAG,"getType"); return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { Log.v(TAG,"insert"); return null; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { Log.v(TAG,"delete"); return 0; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { Log.v(TAG,"update"); return 0; }}
2、注册
// true 允许外部应用启动 反之 不能启动
3、如何配置一个Uri,Uri扮演什么样的角色。
Content://com.jewelermobile.gangfu.zdydemo1.DictProvider/资源部分
(1)Content:// 这部分是Android的ContentProvider规定,并且固定
(2)com.jewelermobile.gangfu.zdydemo1.DictProvider 这部分是注册时的android:authorities,注册之后并且固定
(3)资源部分,这个根据查询资源改变所以不固定
Uri其实就是一个地址,只有通过Uri才能对应去操作ContentProvider,就像一条唯一通往胜利道路。
4、怎么从外部应用调用操作此ContentProvider?
Android提供了ContentResolver去操作ContentProvider
final ContentResolver p = this.getContentResolver();
Uri uri = Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/"); private void initContentProvider() { final ContentResolver p = this.getContentResolver(); findViewById(R.id.add).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { p.insert(uri,new ContentValues()); } }); findViewById(R.id.del).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { p.delete(uri,"",new String[]{}); } }); findViewById(R.id.update).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { p.update(uri,null,null,new String[]{}); } }); findViewById(R.id.qur).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { p.query(uri,null,null,null,null); } }); }
运行结果测试
通过测试可以知道每次创建时回调Oncreate方法
public String getType(@NonNull Uri uri)方法的作用,代表当前返回数据MIME类型,如果包含多条记录,那么MIME类型字符串以vnd.android.cursor.dir/开头,如果只有一条记录那么MIME类型字符串以vnd.android.cursor.item/开头。
5、android提供UriMatcher 和 ContentUris工具类操作Uri
(1)、UriMatcher
1、void addUri(String authority,String path,int code) 该方法参数authority和path组成一个Uri,code为当前Uri的标识码
2、int match(Uri uri) 通过注册的Uri获取标识码
UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); //注册Uri uriMatcher.addURI("com.jewelermobile.gangfu.zdydemo1.DictProvider","path",1); //获取注册的Uri标识码 结果为1 uriMatcher.match(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"));
(2)、ContentUris
1、WithAppendedId(Uri uri,int id) 用于为路径加Id
ContentUris.withAppendedId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path"),1); //添加id之后 content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1
2、parseId(Uri uri) 用于指定的Uri中解析出Id
ContentUris.parseId(Uri.parse("content://com.jewelermobile.gangfu.zdydemo1.DictProvider/path/1"));//解析出来的Id为 1
更多相关文章
- AndroidMenifest.xml中android:sharedUserId="android.uid.syste
- Android(安卓)Wi-Fi基本操作
- Android对图片局部扩大的实现
- Android简易计算器(破烂Alpha版,后续更新)
- Google提供Fastboot和ADB单独下载服务
- android的文件操作
- 2011.08.18——— android 图片效果 ImageSwitcher+GestureDetec
- Android(安卓)文件及文件夹操作
- android中 sqlite sql操作