当前位置: 首页 > 编程笔记 >

Android ContentResolver使用说明

东方修谨
2023-03-14
本文向大家介绍Android ContentResolver使用说明,包括了Android ContentResolver使用说明的使用技巧和注意事项,需要的朋友参考一下

Android是如何实现应用程序之间数据共享的?一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),当然需要一定的权限才可以。

如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

当前篇主要说明,如何获取其它应用程序共享的数据,比如获取Android 手机电话薄中的信息。

什么是URI?

在学习如何获取ContentResolver前,有个名词是必须了解的:URI。URI是网络资源的定义,在Android中赋予其更广阔的含义。

将其分为A,B,C,D 4个部分:
A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;
B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的  类名。这个标识在<provider> 元素的 authorities属性中说明:
<provider name=”.TransportationProvider”  authorities=”com.example.transportationprovider”  . . .  >
C:路径,Content Provider使用这些路径来确定当前需要生什么类型的数据,URI中可能不包括路径,也可能包括多个;
D:如果URI中包含,表示需要获取的记录的ID;如果没有ID,就表示返回全部;
由于URI通常比较长,而且有时候容易出错,切难以理解。所以,在Android当中定义了一些辅助类,并且定义了一些常量来代替这些长字符串,例如:People.CONTENT_URI

ContentResolver 介绍说明

看完这些介绍,大家一定就明白了,ContentResolver是通过URI来查询ContentProvider中提供的数据。除了URI以外,还必须知道需要获取的数据段的名称,以及此数据段的数据类型。如果你需要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。

前面也提到了Content providers是以类似数据库中表的方式将数据暴露出去,那么ContentResolver也将采用类似数据库的操作来从Content providers中获取数据。现在简要介绍ContentResolver的主要接口,如下:

返回值 函数声明
final Uri insert(Uri url, ContentValues values)Inserts a row into a table at the given URL.
final int delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI.
final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set.
final int update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI.

看到这里,是否感觉与数据库的操作基本一样的?就是这样的,详细解析请参考了 Android SQLite解析 中的说明,不在此详细说明。

最后一个问题:如何获取ContentResolver?调用getContentResolver (),例如:ContentResolver cr = getContentResolver();

知道ContentResolver是通过ContentProvider来获取其他与应用程序共享的数据,那么ContentResolver与ContentProvider的接口应该差不多的。

其中ContentProvider负责

    * 组织应用程序的数据;
    * 向其他应用程序提供数据;

ContentResolver则负责

    * 获取ContentProvider提供的数据;
    * 修改/添加/删除更新数据等;

ContentProvider 是如何向外界提供数据的?

Android提供了ContentProvider,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。至于如何从URI中识别出外界需要的是哪个“数据库”,这就是Android底层需要做的事情了,不在此详细说。简要分析下ContentProvider向外界提供数据操作的接口:

query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])

这些操作与数据库的操作基本上完全一样,在此不详细说,具体的解析可以参考 Android Sqlite解析 中的详细说明。需要特殊说明的地方是URI:

在URI的D部分可能包含一个_ID ,这个应该出现在SQL语句中的,可以以种特殊的方式出现,这就要求我们在提供数据的时候,需要来额外关注这个特殊的信息。Android  SDK推荐的方法是:在提供数据表字段中包含一个ID,在创建表时INTEGER PRIMARY KEY AUTOINCREMENT标识此ID字段。

ContentProvider 是如何组织数据的?

组织数据主要包括:存储数据,读取数据,以数据库的方式暴露数据。数据的存储需要根据设计的需求,选择合适的存储结构,首选数据库,当然也可以选择本地其他文件,甚至可以是网络上的数据。数据的读取,以数据库的方式暴露数据这就要求,无论数据是如何存储的,数据最后必须以数据的方式访问。

可能还有2个问题,是需要关注的。

  1. ContentProvider是什么时候创建的,是谁创建的?访问某个应用程序共享的数据,是否需要启动这个应用程序?这个问题在 Android SDK中没有明确说明,但是从数据共享的角度出发,ContentProvider应该是Android在系统启动时就创建了,否则就谈不上数据共享了。这就要求在AndroidManifest.XML中使用<provider>元素明确定义。
  2. 可能会有多个程序同时通过ContentResolver访问一个ContentProvider,会不会导致像数据库那样的“脏数据”?这个问题一方面需要数据库访问的同步,尤其是数据写入的同步,在AndroidManifest.XML中定义ContentProvider的时候,需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了 notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在 ContentResolver中应该有一些类似register,unregister的接口。

至此,已经对ContentProvider提供了比较全面的分析,至于如何创建ContentProvider,可通过2种方法:创建一个属于你自己的ContentProvider或者将你的数据添加到一个已经存在的ContentProvider中,当然前提是有相同数据类型并且有写入 Content provider的权限。在Android SDK的sample中提供的 Notepad具体实例 中去看源代码!

制作ContentResolver实例

以上就完全介绍了如何获取、使用ContentResolver,启动Eclipes,制作一个完整的实例如下:
打开showcontent.java,修改如下:

package moandroid.showcontact;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.Phones;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;
public class showcontact extends ListActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_html" target="_blank">list_item_2, c,
new String[] { Phones.NAME, Phones.NUMBER },
new int[] { android.R.id.text1, android.R.id.text2 });
setListAdapter(adapter);
}
}

然后在AndroidManifest.XML中<application>元素前增加如下许可:

<uses-permission android:name=”android.permission.READ_CONTACTS” />

最后运行程序,在模拟器启动后,单击Menu返回到Home界面,打开Contacts选择Contacts标签页,添加2个联系人信息。返回到Home,选择moandroid.showcontact运行,刚添加的2个联系人信息将显示在界面上,如下:

总结说明

ContentResolver的使用极大的方便了应用程序之间共享数据,如何将应用程序的数据完全暴露给给他应用程序使用了

android中ContentResolver的使用

使用ContentResolver增删改查电话本信息,详细代码如下:

import android.app.ListActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListAdapter;

public class MainActivity extends ListActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		insert("tester1");
		update("tester2", new String(People.NAME + "='tester1'"));
		delete(new String(People.NAME + "='tester2'"));
		select();
	}

	/*
	 * 向联系人列表中插入新的联系人
	 * @param name The value of People.NAME
	 */
	public void insert(String name) {
		ContentValues ct = new ContentValues();
		ct.put(People.NAME, name);
		getContentResolver().insert(People.CONTENT_URI, ct);
	}
 
	/*
	 * 更新手机中指定的联系人
	 * @param name A new name for People.NAME
	 * @param where The update requirement.
	 */
	public void update(String name, String where) {
		ContentValues ct = new ContentValues();
		ct.put(People.NAME, name);
		getContentResolver().update(People.CONTENT_URI, ct, where, null);
	}

	/*
	 * 删除手机中指定的联系人
	 * @param where The delete requirement.
	 */
	public void delete(String where) {
		getContentResolver().delete(People.CONTENT_URI, where, null);
	}

	// 查找所有联系人
	public void select() {
		Cursor cursor = getContentResolver().query(People.CONTENT_URI,
				new String[] { People._ID, People.NAME }, null, null, null);

		ListAdapter adapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_list_item_1, cursor,
				new String[] { People.NAME }, new int[] { android.R.id.text1 });

		setListAdapter(adapter);
	}
}

AndroidManifest.xml中添加如下权限:

 <uses-permission android:name="android.permission.READ_CONTACTS"/>
 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
 类似资料:
  • 本文档所描述的 API 接口,旨在输出 百度移动统计 站点的报告数据,为站点用户提供方便。为方便您使用此API,请注意以下几点: 为使调用方与接口提供方的接口版本保持一致,请调用接口的开发者提供联系信息,以供接口升级时提前通知,避免不必要的损失。信息通过邮件提供,具体如下: 邮箱地址:apptongji@baidu.com 邮件标题:百度移动统计接口调用方信息备案-“开发者姓名” 邮件内容: 开发

  • 播放SDK 版本: 2.0.1 日期: 2020-09-29 SDK文档及下载 下载地址:https://hdgit.bokecc.com/ccvideo/VOD_miniprogram 版本更新记录 更新日期 版本号 更新内容 2020-09-29 V2.0.1 修复播放结束回调不成功问题 2020-07-16 V2.0.0 包含播放、暂停、切换视频、设置播放时长、获取当前播放时长、获取视频时长

  • 点击查看在线demo(标准版) 点击查看在线demo(VUE版) 点击下载demo 一、版本说明 1、版本 最新版本 V2.5.1 日期 2021-02-02 2、版本更新记录 更新日期 版本号 更新内容 2021-02-02 2.5.1 1、新增倍速按钮显示控制参数 2、新增PC端全屏禁用和显示控制参数 2021-01-28 2.5.0 新增自定义logo参数 2021-01-26 2.4.11

  • HI-NGINX是NGINX的增强版。 它除了保留NGINX全部功能之外,同时支持多种编程语言进行web混合开发。 它支持的编程语言包括: C++ java lua python quickjs 这些编程语言中,前两种属于编译型语言,后几种则属于解释型语言。这意味着,当解释型语言无力承担性能需求时,你可以切换至编译型语言;而当编译型语言无力追赶开发进度表时,你可以切换至解释型语言。 因此,当你所在

  • 1.SDK目录结构 我们提供的Demo示例结构目录。 2.将SDK集成到开发环境 注意: 使用 SDK 前,首先需要将其集成到您的开发环境中。项目的开发环境需要在 Xcode 6.0版本及以上,运行环境需要 iOS8.0 及以上,下文将说明开发中需要的详细操作。 2.1 配置开发环境 2.1.1 需要添加 Xcode 链接器参数:-ObjC 和 -lstdc++。 添加 -ObjC 参数后链接器可

  • 一、 概要 1.1、 简介 Android 活体检测SDK 是一个 Android 端活体检测解决方案,将真实人脸与照片、视频等假冒人脸区分开,有效防止假冒攻击。 目前SDK支持最低版本minSdkVersion 18; 目前SDK不提供开放下载,获取SDK包请联系 market@linkface.cn 1.2、技术原理 活体检测技术是由人脸检测、动作分析和人脸图像采集三部分组成。 人脸检测、定位

  • 1.SDK目录结构 我们提供的Demo示例结构目录。 2.将SDK集成到开发环境 注意: 使用 SDK 前,首先需要将其集成到您的开发环境中。项目的开发环境需要在 Xcode 6.0版本及以上,运行环境需要 iOS8.0 及以上,下文将说明开发中需要的详细操作。 2.1 配置开发环境 2.1.1 需要添加 Xcode 链接器参数:-ObjC 和 -lstdc++。 添加 -ObjC 参数后链接器可

  • 时间序列异常检测接口 用户可根据场景选择使用API接口对时间序列进行异常检测: 1、量值检测:适用于大多数KPI指标数据的检测,使用无监督和有监督联合检测,会加载检测模型 2、率值检测:适用于正态分布类型数据的检测,使用无监督算法进行检测,如成功率等生死指标数据的检测 HTTP接口调用请使用搭建的后端服务地址;Python接口可直接调用 当前检测时间窗口选取为3小时,每分钟1个数据点,即窗口值为1