ContentProvider

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对这三个部分做了如下格式规定:

  1. 必须以vnd开头
  2. 如果内容URl以路径结尾,则后接android.cursor.dir/,如果内容URl以id结尾,则后接android.cursor.item/
  3. 最后接vnd.authority.path
原文地址:https://www.cnblogs.com/ngy-liupeng/p/15170797.html