• 关于ContentProvider(初识篇)


    ContentProvider是Android四大组件之一,用于系统中APP之间的联动与数据交换。

    ContentProvider提供了6种方法可供开发者重写:

    public boolean onCreate();

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

    public String getType(Uri uri) ;

    public Uri insert(Uri uri, ContentValues values);

    public int delete(Uri uri, String selection, String[] selectionArgs);

    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);

    分别对应数据库的表的创建、判断类型、查、增、删、改。

    使用方法:


    1、新建类并继承ContentProvider

    public class ProvideHelper extends ContentProvider {

    2、将需要改写的6种方法放入该类中

     public boolean onCreate() {        return false;
        }
        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
            return null;
        }
        @Override
        public String getType(Uri uri) {
            return null;
        }
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            return null;
        }
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {       return 0;
        }
        @Override
        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
            return 0;
        }

    3、配置AndroidManifest文件

    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <provider
                android:authorities="fish.lsy.provide.work"
                android:name=".ProvideHelper"
                android:exported="true"/>

      其中,android:authorities即是其他类找到该类的地址;android:name即是这个provider类的名称;android:exported表示该类的方法能否被其他应用调用,选true就是可以。

    4、在另一个软件中使用这些方法

    1)申明ContentResolver 

     ContentResolver contentResolver;

    2)建立变量储存Uri地址

    Uri uri = Uri.parse("content://fish.lsy.provide.work/");

      PS:这里前面是要加"content://"的,后面的可照AndroidManifest中的android:authorities复制并加上"/"

    3)调用contentResolver的方法

    result = contentResolver.delete(uri,"name",null);

      contentResolver根据uri即可找到相应的应用,对其进行该应用所提供的操作。

    5、其实,ContentProvider的6个方法只是构建了数据库方便使用的输入输出模式,方法的实现完全由开发者自定义和数据库毫无关系。

      但是,往往一个应用,不会只有一个表,因此,我们要为不同的表设置不同的操作。Android框架为我们提供了一个方便的类 UriMatcher我们可以通过它的方法来匹配Uri。

    接上面的使用步骤

    6、申明static的UriMatcher,并预设Uri地址和其中的表。

    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        static{
            uriMatcher.addURI("fish.lsy.provide.work","work1",1);
            uriMatcher.addURI("fish.lsy.provide.work","work2",2);
        }

      其中,UriMatcher.NO_MATCH为预设的常量-1,即当找不到匹配的Uri时,即会返回该值;而addURI的第三个参数,则是表示当Uri匹配成功时,返回的数值,据此我们可以对不同的匹配结果加以区分。

    7、在ContentProvider对应的方法中对传来的Uri作判断。

    public int delete(Uri uri, String selection, String[] selectionArgs) {
            switch (uriMatcher.match(uri)){
                case 1:
                    if(selection.equals("lsysb")){
                        return 233;
                    }
                    return 111;
                case 2:
                    if(selection.equals("xxysb")){
                        return 2333;
                    }
                    return 222;
                default:
                    throw new IllegalArgumentException();
            }
        }

    综上,ContentProvider为其他应用提供了操作本应用的方法,可以实现应用间的数据共享和操作。

  • 相关阅读:
    HDU 6430 Problem E. TeaTree(虚树)
    hdu6437 Problem L.Videos(网络流)
    Rikka with Prefix Sum(组合数学)
    借教室
    2018年全国多校算法寒假训练营练习比赛(第五场)H Tree Recovery
    1296 营业额统计
    FZU oj Problem 2082 过路费
    大数乘法(适合k进制)
    重载小于号
    莫比乌斯
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/4202403.html
Copyright © 2020-2023  润新知