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);
}
});
}
运行结果测试
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