美文网首页
ContentProvider详解(摘录)

ContentProvider详解(摘录)

作者: 沙子修仙人 | 来源:发表于2020-04-28 17:56 被阅读0次

一. ContentProvider是个啥?

ContentProvider——内容提供者。它是一个类,这个类主要是对Android系统中进行共享的数据进行包装,并提供了一组统一的访问接口供其他程序调用。这些被共享的数据,可以使系统自己的也可以使我们个人应用程序中的数据。

二. 为什么要有ContentProvider这个类?

在Android中,数据的存储有很多种方式,最常用的就是SQLite和XML文件方式。在不同的应用程序间,其实数据是不能直接被相互访问和操作的,在这种情况下,ContentProvider很好的被用来解决了不同应用程序间数据共享的问题。

其实在Android系统中,已经为我们提供了许多ContentProvider,如:Contacts、Browser、CallLog、Settings等等。那么,Android系统中提供了这么多的ContentProvider,另外还有我们自己公开的共享数据,我们在写程序的时候,怎么才能让我们的应用程序知道去哪儿取、如何取这些数据呢?我们自然的会想到URI。

三. URI是个啥?在ContentProvider中有什么用处?URI中的几个方法。

URI(Uniform Resource Identifier)——统一资源定位符,URI在ContentProvider中代表了要操做的数据。

在Android系统中通常的URI格式为:content://LiB.cprovider.myprovider.Users/User/21
在万维网访问时通常用的URI格式为:http://www.XXXX.com/AAA/123

content://——schema,这个是Android中已经定义好的一个标准。我个人一直认为这和我们的http://有异曲同工之妙,都是代表的协议。ContentProvider(内容提供者)的scheme已经由Android所规定为:content://
LiB.cprovider.myprovider.Users——authority(主机名),用于唯一标识这个ContentProvider,外部调用者通过这个authority来找到它。相当于www.XXXX.com,代表的是我们ContentProvider所在的”域名”,这个”域名”在我们Android中一定要是唯一的,否则系统怎么能知道该找哪一个Provider呢?所以一般情况下,建议采用完整的包名加类名来标识这个ContentProvider的authority。
/User/21——路径,用来标识我们要操作的数据。/user/21表示的意思是——找到User中id为21的记录。其实这个相当于/AAA/123。

综上所述,content://LiB.cprovider.myprovider.Users/User/21所代表的URI的意思为:标识LiB.cprovider.myprovider中Users表中_ID为21的User项。

四. Android系统中为我们提供了些有关操作URI的方法:

UriMatcher:用于匹配Uri,它的用法如下:

1. 首先把你需要匹配Uri路径全部给注册上,如下:

static {
       //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
       UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

       //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

       //如果match()方法匹配   content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
}

2. 注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配。 如果匹配到就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

  • withAppendedId(uri, id)用于为路径加上ID部分
  • parseId(uri)方法用于从路径中获取ID部分

ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver

对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

五. ContentProvider中公开的几个方法

1. public boolean onCreate():该方法在ContentProvider创建后就会被调用,Android系统运行后,ContentProvider只有在被第一次使用它时才会被创建。

2. public Uri insert(Uri uri, ContentValues values):外部应用程序通过这个方法向 ContentProvider添加数据。

  • uri——标识操作数据的URI
  • values——需要添加数据的键值对

3. public int delete(Uri uri, String selection, String[] selectionArgs):外部应用程序通过这个方法从 ContentProvider中删除数据。

  • uri——标识操作数据的URI
  • selection——构成筛选添加的语句,如"id=1" 或者 "id=?"
  • selectionArgs——对应selection的两种情况可以传入null 或者 new String[]{"1"}

4. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):外部应用程序通过这个方法对 ContentProvider中的数据进行更新。

  • values——对应需要更新的键值对,键为对应共享数据中的字段,值为对应的修改值
  • 其余参数同delete方法

5. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):外部应用程序通过这个方法从ContentProvider中获取数据,并返回一个Cursor对象。

  • projection——需要从Contentprovider中选择的字段,如果为空,则返回的Cursor将包含所有的字段。
  • sortOrder——默认的排序规则
  • 其余参数同delete方法

6. public String getType(Uri arg0):返回数据类型

六. 实现步骤:

  • 第一:首先生成一个继承contentprovider的类.

  • 第二:在androidMainfest.xml里面添加一个provider的标签就可以了.

    <provider  android:name="zuoyeSQLlite.hall.MyContentProvider"
                android:authorities="zuoyeSQLite.hall.MyContentProvider"/>

是不是很简单?其他程序访问的时候只要按以下步骤就可以访问到了:

String AUTHORY="zuoyeSQLite.hall.MyContentProvider"
Uri uri=Uri.Uri.parse("content://"+AUTHORY+"/userinfo1");

AUTHORY其实就是 android:authorities的值.,注意.这里必须一样..否则系统是找不到的.也是就是

然后获取一个

ContentResolver mContentResolver=getContentResolver();

这样就其他程序就可以访问我们的数据了..

ContentResolver对应的几个方法:

  • query(Uri, String[], String, String[], String):查询数据
  • insert(Uri, ContentValues):插入数据
  • update(Uri, ContentValues, String, String[]):更新数据
  • delete(Uri, String, String[]):删除数据

使用ContentResolver的接口实现数据的增删改查等操作。
具体实现,详见原文链接

相关文章

  • ContentProvider详解(摘录)

    一. ContentProvider是个啥? ContentProvider——内容提供者。它是一个类,这个类主要...

  • ContentProvider详解

    概述 ContentProvider虽说我们平时用的并不多,但是作为安卓四大组件之一,其地位不容忽视。Conten...

  • contentProvider详解

    ContentProvider是android中提供对应不用应用间数据共享的方式,也就是可以进行进程间通信。作为进...

  • ContentProvider 详解

    为什么要设计ContentProvider 1.封装数据,提供统一接口,当项目需求需要修改数据源的时候,节省时间和...

  • ContentProvider使用详解

    ContentProvider是Android四大组件之一。 ContentProvider一般为存储和获取数据提...

  • ContentProvider使用详解

    ContentProvider是Android四大组件之一。 ContentProvider一般为存储和获取数据提...

  • ContentProvider使用详解

    概述 Android提供专门用于不同应用间进行数据共享的方式,底层实现是Binder,但是使用的过程比AIDL简单...

  • ContentProvider 使用详解

    和你一起终身学习,这里是程序员 Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇...

  • Android ContentProvider详解

    Android提供了5种方式来让用户保存持久化应用程序数据。根据自己的需求来做选择,比如数据是否是应用程序私有的,...

  • ContentProvider-基础详解

    据我了解,ContentProvider 是本App 数据库上套的一层供外部App调用的壳, 内部App仅继承Co...

网友评论

      本文标题:ContentProvider详解(摘录)

      本文链接:https://www.haomeiwen.com/subject/rkrbwhtx.html