IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android之ContentProvider -> 正文阅读

[移动开发]Android之ContentProvider

在Android开发中,有时用户确实需要在应用之间进行数据的交换。我们知道通过指定文件的操作模式为 Context.MODE_WORLD_READABLE或 Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。但是如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,比如采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用 sharedpreferences共享数据,需要使用sharedpreferences?API读取数据。为此,Google提供了 ContentProvider?(内容提供者),它可以实现统一的数据访问方式。

ContentProvider 常用类简介

ContentProvider(内容提供者)是Android 中的四大组件之一,主要用于对外共享数据,也就是通过ContenProvider 把应用中的数据共享给其他应用访问,其他应用可以通过 ContenProvider对指定应用中的数据进行操作。ContenProvider分为系统的和自定义的,系统的例如联系人、图片等数据。内容提供者提供的数据可以存储于文件系统、SOLite数据库或其他方式。

当应用需要通过ContentProvider 对外共享数据时,第一步需要继承 ContentProvider 并重写下面的方法。

需要被重写的 ContentProvider 类的主要方法如下:

public?bolean onCreate()?在创建 ContentProvider 时调用此方法

Public?Cursor query(Uri?uri,?String[] args1, Sring str1, String[] args2, String str2)

用于查询指定 Uri 的 ContentProvider,返回值为一个 Cursor 类型的数据集

public?Uri?insert(Uri uri, ContentValues cv) 用于添加数据到指定 Uri 的 ContentProvider 中,并返回一个Uri

public?int update(Uri uri, ContentValues cv,String string, Sring[]?stringArgs)

用于更新指定 Uri 的 ContentProvider 中的数据

public?int delete(Uri uri, String string, String[] stringArgs)?用于从指定 Uri的 ContentProvider 中删除数据

public String getType(Uri uri)?用于返回指定的 Uri 中数据的 MIME 类型

在这些方法中,getType(Uri uri)方法比较难以理解。此方法会根据传进来的URI生成一个代表 MimeType 的字符串,而此字符串的生成也有规则∶

如果是单条记录,应该返回以 vnd.android.cursor.item/为首的字符串。

如果是多条记录,应该返回以 vnd.android.cursor.dir/为首的字符串。

至于字符串”/”后的字符,可以随便定义。

这里考虑一个问题,即为什么我们返回的 MimeType 要以 vnd.android.cursor.item/或 vnd.android.cusor.dir/开头。我们知道,MIME类型其实就是一个字符串,中间用一个"/"来隔开,"/"前面是系统识别的部分,相当于我们定义一个变量时的变量数据类型,通过这个"数据类型",系统能够知道我们所要表示的是什么内容。"/"后面的就是我们自己定义的"变量名"。

???第二步需要在AndroidManifest.xml中对ContentProvider进行配置。为了能让其他应用找到该ContentProvider,采用authorities(主机名/域名)对ContenProvi?der进行唯一标识,可以把ContentProvider看作一个网站,authorities就是它的域名。同时,为了使其他应用能够访问到这个ContentProvider,将 android:exported属性设置为 true。而发布的内容提供者可能会被多个应用使用,所以将android:multiprocess属性设置为 true。具体的做法就是将如下格式的放置于 application 节点下:

<provider

Android:name="com. buaa.data.provider.UserProvider" android:authorities="com.buaa.data.provider.UserProvider"

android:exported="true"

Android:multiprocess="true"/?>

继承了 ContentProvider类,并完成上述的方法重写以及在AndroidManifest.xml中的配置之后,这个应用就可以称为 ContenProvider了。当外部应用需要对 ContentProvider 中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,它提供了与?ContenProvider相对应的增、删、改、查的方法。要获取 ContentResolver 对象,可以使用Context提供的 getContentResolver()方法。

通过前面对ContentProvider 的介绍,会发现在它的几个方法中都有 Uri。通过对它的简描述,可以指定它是跟数据相关的。准确地说,Uri 代表了要操作的数据,Uri 主要包含两信息∶ 需要操作的 ContentProvider 以及对 ContentProvider 中的什么数据进行操作。一个Uri通常由三部分组成∶

(1)scheme:ContentProvider 的 scheme 已经由 Android 规定为 content://。

(2)主机名(Authority):用于唯一标识 ContentProvider,外部调用者可以根据这个标识来找到它。

(3)路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定。

对于这种描述,初学者可能还是不易理解,下面举3个例子来帮助读者理解 Uri。例如,要操作 user 中 id 为 10 的记录,Uri 应该写成 content∶//com.buaa.data.provider.userProvider/user/10; 要操作user 中id为 10 的记录的 name 字段,就需要在上面的 Uri最后加上name,即 content;/com.buaa.data.provider.userProdiver/user/10/name;如果要操作 user中的所有记录,Uri则应该为 content://com.buaa.data.provider.userProvider/user。

要获取一个 Uri 对象,只需调用 Uri 的静态方法 parse(),就可以按照由上文格式组成的Uri字符串转化为 Uri 对象了:?Uri uri=Uri.parse("content://com.buaa.data.provider.userProvider/user”).

另外,Uri 代表了要操作的数据,所以在开发中会经常需要解析 Uri,并从 Uri 中获取数据。Android 系统提供了两个用于操作 Uri的工具类,分别为 UriMatcher 和 ContentUris。

其中,UriMatcher 类用于匹配 Uri。具体来说,UriMatcher 会在内容提供者中注册需要的 Uri,并在后面的使用中用 UriMatcher 类的 match(Uri uri)来进行匹配,用于确认是不是合法的 Uri。使用它需要进行如下 3步操作:

1、对 UriMatcher 类进行初始化。初始化使用的代码是 UriMatcher matcher= new UriMatcherUriMachrNO_MATCH)。其中,常量 UrMatcherNO_MATCH 表示如果在之后调用osatUnun)进行匹配操作,不匹配任何路径时的返回码。

2、对Uri进行注册。使用 UriMatcher对象调用 addURI()就可以把需要匹配的 Uri?进行注册了。这里具体说明一下它们的意义。

执行 macher.addURI("com.buaa.data.provider.userProvider,"usr",USER)代码时,表示如果 match()方法匹配 content://com.buaa.data.provider.userProvider/user?路径就匹配成功,并返回匹配码为 USER。

执行matcher.addURI("com.buaa.data.provider.userProvider,"user/#",USER_ID)代码时,表示如果match()方法匹配content://com.buaa.data.provider.userProvider/user/20路径就匹配成功,并返回匹配码为 USER_ID。上述代码中的"#"为通配符。

3、注册完需要匹配的Uri后就可以使用matcher.match(uri)方法对输入的Uri 进行匹配了,如果匹配就返回匹配码。

ContentUris 类用于获取 Uri 路径后面的 ID 部分,它有两个比较实用的方法,即 wihAppendedId(uri,id)与 parseld(uri)。

  1. witAppendedId(uri,d)∶此方法主要用于为 Uri路径加上id部分。使用范例如下:

?Uri?uri=Uri.parse("content://com.buaa.data.provider.userProvider/user") ;?

Uri resultUri=ContentUris.withAppendedId(uri,10);

经过上述操作后,生成的 Uri 为content://com.buaa.data.provider.userProvider/user/10。

  1. parseld(uri):?此方法主要用于从 Uri 路径中获取 ID 部分。使用范例如下∶ Uri uri= Uri.parse("content://com.buaa.data.provider.userProdiver/user/15");

long personid = ContentUris.parseld(uri);

通过上述步骤就可以获取 Uri 路径的 id 部分为 15。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:27:50  更:2021-08-28 09:29:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:25:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码