• android中的ContentProvider实现数据共享


    为了在应用程序之间交换数据,android中提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API。当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序可以通过提供contentProvider来实现,其他应用程序可通过ContentResolver来操作ContentProvider暴露的数据。

    ContentProvider是android应用中的四大组件之一,使用时需要在AndroidManifest.xml文件中进行配置。

    一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他的应用程序都可以通过该操作接口来操作程序内部的数据,包括增删改查。

    ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许其他的应用访问或者修改数据。其他的应用程序使用ContentResolver根据Uri去访问操作指定的数据。

    开发一个ContentProvider的步骤:

    1、定义自己的ContentProvider类,该类要继承android提供的ContentProvider基类

    2、在AndroidManifest.xml清单文件中对ContentProvider进行注册

     <provider android:name=".TestProvider" android:authorities="com.test.testProvider"/>


    自定义的ContentProvider类继承android中提供的ContentProvider基类后还需要实现下面几个方法才能实现对外暴露数据:

    onCreate() :该方法在ContentProvider创建后被调用,,当其他的应用程序第一次访问ContentProvider时,该contentProvider会被创建出来,并立即调用该onCreate()方法。适合做初始化。

    query(Uri uri, String[] projection, String selection,    String[] selectionArgs, String sortOrder) :根据Uri查询满足selection条件的数据,其中projection是列名列表,表明只选择指定的数据列。

    getType(Uri uri):返回Uri多代表的数据的MIME类型。如果Uri对应的数据包括多条记录,那么MIME类型的字符串应该返回以vnd.android.cursor.dir/开头,如果是一条数据那么返回的MIME字符串应该以vnd.android.cursor.item/开头

    insert(Uri uri, ContentValues values) :根据Uri插入values对应的额数据

    delete(Uri uri, String selection, String[] selectionArgs) :根据Uri删除和selection条件匹配的数据

    update(Uri uri, ContentValues values, String selection,    String[] selectionArgs) :根据Uri更新匹配条件的数据

    Uri介绍

     android中的Uri:

    content://com.test.testProvider/words

    Uri分为三部分:

    content:// : 这个部分是android所规定的的,是固定写法。

    com.test.testProvider :这个部分是ContentProvider的authorities(),系统就是由这个部分找到需要操作那个ContentProvider。只要访问指定的ContentProvider,这个部分是固定的。

    words:资源部分,当访问不同的资源时,这个部分是动态改变的。

    android中Uri的丰富功能:

    content://com.test.testProvider/word/2

    此时他要访问的资源为word/2,代表访问word数据中ID为2的记录

    content://com.test.testProvider/word/2/word

    此时他要访问的资源为word/2,这意味着访问word数据中ID为2的记录的word字段

    content://com.test.testProvider/words   //访问全部的数据

    数据为XML格式的Uri

    content://com.test.testProvider/word/detail/

    代表访问word节点下的detail节点

    android中将字符串转化为Uri的工具类Uri:

    Uri uri = Uri.parse("content://com.test.testProvider/word/2/word"); 

    ContentResolver操作数据

    Context提供了如下的方法来获取ContentResolver对象:getContentResolver()

    ContentResolver提供如下的方法操作数据:

    insert(Uri url, ContentValues values):向Uri对应的ContentProvider中插入values数据

    delete(Uri url, String where, String[] selectionArgs):删除Uri对应的ContentProvider中匹配where条件的数据

    update(Uri uri, ContentValues values, String where, String[] selectionArgs):更新Uri对应的ContentProvider中where条件匹配的数据

    query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):查询Uri对应的ContentProvider中匹配where条件的数据

    一般来说ContentProvider是单例模式的,当多个应用程序通过ConentResolver来操作ContentProvider提供的数据时,ConentResolver调用的数据操作都将会委托给同一个ContentProvider处理。

    为了确定ContentProvider实际能匹配的Uri,以及确定每个方法中Uri参数所操作的数据,android中提供了UriMatcher工具类:

    addURI(String authority, String path, int code):该方法用于向UriMatcher对象注册Uri,其中authority和path组合成一个Uri,code则代表该Uri对应的标识码。

    match(Uri uri):根据前面注册的Uri来判断指定的Uri对应的标示码,如果找不到匹配标识码则返回-1。

    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    matcher.addURI("com.test.testProvider", "words", 1);
    matcher.addURI("com.test.testProvider", "word/#", 2);

    上面的#位通配符

    // 返回1
    matcher.match(Uri.parse("content://com.test.testProvider/words"));
    // 返回2
    matcher.match(Uri.parse("content://com.test.testProvider/word/2"));
    // 返回2
    matcher.match(Uri.parse("content://com.test.testProvider/word/22"));


    android中还提供了一个ContentUris工具类,用于操作Uri字符串:

    Uri withAppendedId(Uri contentUri, long id):添加id部分

    parseId(Uri contentUri):解析出包含id

    监听ContentProvider的数据变化:

    ContentObserver:当ContentProvider中的数据改变时调用如下的代码

    getContext().getContentResolver().notifyChange(uri, null);

    这行代码用于通知所有注册在该Uri上的监听者:该ContentProvider所共享的数据发生了改变

    为了监听ContentProvider数据的改变,需要利用android中提供的ContentObserver基类。监听ContentProvider数据改变的监听器需要继承ContentObserver类,并重写该基类所定义的onChange(boolean selfChange)方法——当他所监听的ContentProvider的数据发生改变时,该onChange将会被调用。为了监听ContentProvider的数据变化,需要通过ContentResolver向指定的Uri注册ContentObserver监听器。ContentResolver提供如下的方法来注册监听器:

    registerContentObserver(Uri uri, boolean notifyForDescendents,ContentObserver observer)

    uri:该监听器所监听的ContentProvider的Uri
    notifyForDescendents:如果该参数为true,假如监听的Uri为content://abc,那么Uri为content://abc/xyz、content://abc/xyz/foo的数据改变也会触发该监听器,如果为false,那么只有Uri为content://abc的数据发生了变化才会触发该监听器。

    getContentResolver().registerContentObserver(uri, notifyForDescendents, observer)
  • 相关阅读:
    重识linux-常见压缩和解压缩命令
    重识linux-压缩文件的原理
    重识linux-关于selinux
    重识linux-循环执行的例行性工作调度
    重识linux-仅执行一次的工作调动at
    Python资源
    python hehe
    Chrome 消息机制
    自己动手写reg注册表文件
    用JavaScript截图
  • 原文地址:https://www.cnblogs.com/heml/p/3569452.html
Copyright © 2020-2023  润新知