在前两年的开发中我们是很少看到ContentProvider的情况,但随着社会的进步数据化的东西越来越多,进而需要各种数据访问也就越来越多。android提供了ContentProvider来应对不同应用间的数据访问。下面我们就对ContentProvider进行一个简单的用法介绍;
在数据存储端
- 继承ContentPovider;
- AndroidManifest.xml中配置;
- 在ContentProvider中匹配访问地址的正确性;
- 得到ContentResolver传递过来的参数;(与第6步对应)
- 操作数据库;
数据访问端;
6.ContentResolver传递Uri地址,以及要操纵数据库CRUD的对应参数给ContentProvider的CRUD方法;(与第3.4步对应)
我们根据上面的思路来一一实现
首先继承ContentProvider重写对应的方法;
public class ContentProvideDemo extends ContentProvider {
private static final String TAG = ContentProvideDemo.class.getSimpleName();
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.d(TAG, "query: enter");
System.out.print("uri = " + uri);
return null;
}
@Override
public String getType(Uri uri) {
Log.d(TAG, "getType: enter");
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.d(TAG, "insert: enter");
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.d(TAG, "delete: enter");
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.d(TAG, "update: enter");
return 0;
}
}
AndroidManifest.xml中配置;
<provider
android:name=".ContentProvideDemo" android:authorities="com.example.concentrated"
android:exported="true"/>
//这里的authorities相当于协议。
//exported="true"表示能被外界访问;
在ContentProvider中匹配访问地址的正确性;
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
//为UriMatcher注册两个Uri;
/*
String authority, 协议也就是AndroidManifaset.xml文件中配置的authority;
String path,与authority组成一个uri 这里都是自己给出的,因为uri的地址是自己创建的;
int code,code为uri的标示码;
*/
matcher.addURI("com.example.concentrated", "words", 6);
//#号为通配符;
matcher.addURI("com.example.concentrated", "word/#", 3);
//下面说面下这两种配法的意思
/*第一种为标准写法,为常用状态。也就是说当ContentResolver的Uri中的id与addURI中的code一至时才返回code
值不然就返回-1;
第二种,#号为通配符。ContentResolver的Uri中的id不管是什么值,都会返回addURI中的code值;
*/
}
得到ContentResolver传递过来的参数;(与第6步对应)
操作数据库;
ContentResolver传递Uri地址,以及要操纵数据库CRUD的对应参数给ContentProvider的CRUD方法;(与第3.4步对应)
//在ContentResolver中uri的ID值有两种方法
//方法一:
Uri uri = Uri.parse("content://com.example.concentrated/words/6");
//方法二:通过ContentUris的API方法添加id值;
Uri mUri = Uri.parse("content://com.example.concentrated/words");
Uri uri = ContentUris.withAppendedId(mUri, 6);
//ContentUris也可以对uri的id值进行解析;
long wordId = ContenUris.parseId(uri);//获得结果为6;