原创 Android之ContentProvider

2021-8-27 12:30 1672 10 10 分类: 软件与OS 文集: android studio

Android开发中,有时用户确实需要在应用之间进行数据的交换。我们知道通过指定文件的操作模式为 Context.MODE_WORLD_READABLEContext.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) 用于从指定 UriContentProvider 中删除数据

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

在这些方法中,getTypeUri 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 节点下:

ider

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通常由三部分组成

1scheme:ContentProvider scheme 已经由 Android 规定为 content://

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

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

对于这种描述,初学者可能还是不易理解,下面举3个例子来帮助读者理解 Uri。例如要操作 user id 10 的记录,Uri 应该写成 content∶//com.buaa.data.provider.userProvider/user/10; 要操作user id10 的记录的 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 类的 matchUri uri)来进行匹配,用于确认是不是合法的 Uri。使用它需要进行如下 3步操作:

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

2Uri进行注册。使用 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(uriid) parseld(uri)

(1)witAppendedId(urid)此方法主要用于为 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条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条