ContentProvider是Android实现跨程序共享数据的标准方式。不同于文件储存和SharedPreferences存储中的两种全局可读写操作模式,ContentProvider可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄露的风险。
创建
通过新建一个类去继承ContentProvider的方式来创建自己的ContentProvider,使用子类继承的时候,需要将以下六个方法重写。
public class MyProvider extends ContentProvider {
public static final int TABLE1_DIR = 0;
public static final int TABLE1_ITEM = 1;
public static final int TABLE2_DIR = 2;
public static final int TABLE2_ITEM = 3;
private static UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.contacttest.provider", "table1", TABLE1_DIR);
uriMatcher.addURI("com.example.contacttest.provider", "table/#", TABLE1_ITEM);
uriMatcher.addURI("com.example.contacttest.provider", "table2", TABLE2_DIR);
uriMatcher.addURI("com.example.contacttest.provider", "table/#", TABLE2_ITEM);
}
//初始化内容提供器的时候调用,通常在这边完成数据库的创建和升级等操作
@Override
public boolean onCreate() {
//返回true表示内容提供器初始化成功,返回false表示失败
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
switch (uriMatcher.match(uri)) {
case TABLE1_DIR:
return "vnd.android.cursor.dir/vnd.com.example.contacttest.provider.table1";
case TABLE1_ITEM:
return "vnd.android.cursor.item/vnd.com.example.contacttest.provider.table1";
case TABLE2_DIR:
return "vnd.android.cursor.dir/vnd.com.example.contacttest.provider.table2";
case TABLE2_ITEM:
return "vnd.android.cursor.item/vnd.com.example.contacttest.provider.table2";
}
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
return 0;
}
}
重点讲一下getType(),这个方法用于获取Uri对象所对应的MIME类型。一个内容URl对象对应的MIME类型字符串主要由三部分组成,Android对这三个部分做了如下格式规定:
- 必须以vnd开头
- 如果内容URl以路径结尾,则后接android.cursor.dir/,如果内容URl以id结尾,则后接android.cursor.item/
- 最后接vnd.authority.path