在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 节点下:
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。
(2)parseld(uri): 此方法主要用于从 Uri 路径中获取 ID 部分。使用范例如下∶ Uri uri= Uri.parse("content://com.buaa.data.provider.userProdiver/user/15");
long personid = ContentUris.parseld(uri);
通过上述步骤就可以获取 Uri 路径的 id 部分为 15。
作者: 大鸟科创空间, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3949041.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论