| |
|
开发:
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)。
?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。
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 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |