Android学习_ContentProvider和Uri

Android学习_ContentProvider和Uri

大家好,又见面了,我是全栈君。

ContentProvider概述

public abstract class

ContentProvider

extends Object

implements ComponentCallbacks2

Content providers are one of the primary building blocks of Android applications, providing content to applications. They encapsulate data and provide it to applications through the single ContentResolver interface. A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don’t need to share data amongst multiple applications you can use a database directly via SQLiteDatabase.

When a request is made via a ContentResolver the system inspects the authority of the given URI and passes the request to the content provider registered with the authority. The content provider can interpret the rest of the URI however it wants. The UriMatcher class is helpful for parsing URIs.

Android的ContentProvider作用就是在应用程序之间交换数据,假设我们採用文件共享的方式须要注意的是必须採用特定的数据訪问方式。而ContentProvider是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,而其它应用使用ContentResolver依据Uri去訪问操作指定数据。

ContentProvider也是Android应用的四大组件之中的一个,与Activity、Service、BroadcastReceiver类似,都须要在AndroidManifest.xml文件里进行配置。

ContentProvider的使用

  • 定义自己的ContentProvider类,继承子ContentProvider基类;
  • 在AndroidManifest.xml文件里注冊。而且绑定一个URL。

    public class ImageContentProvider extends ContentProvider{

    //该方法用于供外部应用从ContentProvider删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
    
    //该方法用于返回当前Url所代表数据的MIME类型
    @Override
    public String getType(Uri uri) {
        return null;
    }
    
    //该方法用于供外部应用往ContentProvider加入数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    
    //该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次訪问它时才会被创建
    @Override
    public boolean onCreate() {
        return false;
    }
    
    //该方法用于供外部应用从ContentProvider中获取数据
    @Override
    public Cursor query(Uri uri, String[] values, String selection, String[] selectionArgs,
        String sortOrder) {
        return null;
    }
    
    //该方法用于供外部应用更新ContentProvider中的数据
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
    

    }

假设操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,

比如:要得到全部person记录的Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:”vnd.android.cursor.dir/person”。

假设要操作的数据属于非集合类型数据。那么MIME类型字符串应该以vnd.android.cursor.item/开头,

比如:得到id为10的person记录,Uri为content://com.ljq.provider.personprovider/person/10,那么返回的MIME类型字符串为:”vnd.android.cursor.item/person”。

注冊ContentProvider仅仅须要在

Uri概述

Uri还是非常easy理解的,我们能够和互联网的URL进行类比。

content://com.twilight.providers.imagecontentprovider/image/2

这里的意思就是訪问image数据总ID为2的记录。尽管大部分ContentProvider操作的数据都是来自于数据库,可是有时候能够来自于文件、XML或网络等其它的存储方式。

content://com.twilight.providers.imagecontentprovider/image/detail

这里的意思就是操作image节点下的detail节点。

Uri工具类

Android系统提供了2个操作Uri的工具类,各自是UriMatcher和ContentUris。

(1)UriMatcher类是用来匹配Uri

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI("com.twilight.providers.imageprovider", "image", 1);
matcher.addURI("com.twilight.providers.imageprovider", "image/#", 2);
switch (matcher.match(Uri.parse("content://com.twilight.providers.imageprovider/image/7"))) {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}

注冊完须要匹配的Uri后,是用matcher.match(uri)方法对输入的Uri进行匹配,假设匹配就返回匹配码。

(2)ConentUris类用于操作Uri路径后面的ID部分。

Uri uri1 = Uri.parse("content://com.twilight.providers.imageprovider/image");
Uri resultUri = ContentUris.withAppendedId(uri1, 7);
Uri uri2 = Uri.parse("content://com.twilight.providers.imageprovider/image/7");
long resultId = ContentUris.parseId(uri2);

使用ContentResolver操作数据

ContentProvider相当于一个站点,而ContentResolver则相对于HttpClient。一般来说Content是单例模式,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时。数据操作会托付给同一个ContentProvider处理。

(1)调用Activity的ContentResolver()获取ContentResolver对象;
(2)使用ContentResolover的insert、delete、update、query方法操作数据,假设是系统提供的ContentProvider。仅仅须要知道ContentProvider的Uri就可以。

ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.twilight.providers.imageprovider/image");
ContentValues values = new ContentValues();
values.put("name", "pic1");
values.put("date", "2014-03-10");
resolver.insert(uri, values);

监听ContentProvider的数据改变

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

当ContentProvider所共享的数据发生了改变,这行代码能够通知全部注冊在改Uri上的监听者,为了在应用程序中监听ContentProvider数据的改变。须要利用Android提供了ContentObserver基类。

监听ContentProvider数据改变的监听器须要继承ContentObserver类。并重写改基类所定义的onChange(boolean selfChange)方法。在使用的时候须要通过ContentProvider向指定的Uri注冊ContentObserver监听器。

        final class ImageObserver extends ContentObserver {

            public ImageObserver(Handler handler) {
                super(handler);
            }

            public void onChange(boolean selfChange) {
            }
        }

        getContentResolver().registerContentObserver(Uri.parse("content://com.twilight.providers.imageprovider/image"),
        true, new ImageObserver(new Handler()));

haha

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115685.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cde网站_zaqxswcde

    cde网站_zaqxswcde给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4 解释:最长递增路径为 [1, 2, 6, 9]。示例 2:输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]输出:4 解释:最长递增路径是 [3, 4, 5, 6]。注意

    2022年8月9日
    2
  • rabbitMQ与activeMQ区别

    rabbitMQ与activeMQ区别rabbitMQ 与 activeMQ 区别之前的项目中都用到了这两个消息队列 因此总结一下它们的不同之处 做一个笔记 下次需要的时候再行参考 概念为什么使用消息队列六个字 异步 解耦 削峰 使用了消息队列会有什么缺点一个使用了 MQ 的项目 如果连这个问题都没有考虑过 就把 MQ 引进去了 那就给自己的项目带来了风险 我们引入一个技术 要对这个技术的弊端有充分的认识 才能做好预防 要记住 不要给公司挖坑 从以下两个个角度来考虑 系统可用性降低 你想啊 本来其他系统只要运行好好的 那你的系统就是正常的 现

    2025年7月8日
    5
  • MySQL的安装和配置(超详细图文教程)「建议收藏」

    MySQL的安装和配置(超详细图文教程)「建议收藏」数据库的安装1.打开下载的mysql安装文件双击解压缩,运行“mysql-5.5.40-win32.msi”。2.选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续。3.点选“Browse”,手动指定安装目录。4.填上安装目录,我的是“d:\ProgramFiles(x86)…

    2022年4月20日
    52
  • 系统启动u盘制作方法_U盘启动

    系统启动u盘制作方法_U盘启动叙:之前自己的系统是家庭版的,在自己升级为专…

    2022年8月2日
    7
  • hybrid开发模式

    hybrid开发模式韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha

    2022年9月22日
    3
  • SQL学习(二):concat函数(连接字符串)

    SQL学习(二):concat函数(连接字符串)concat函数(连接字符串):使用方法:CONCAT(str1,str2,…)返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型cast,例如:SELECTCONCAT(CAST(int_colASCHAR),char_col)concat函数

    2022年5月3日
    124

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号