Content Provider 使用入门

合集下载

contentprovide例子(一)

contentprovide例子(一)

- ContentProvider示例一:联系人数据库在Android开发中,我们经常会需要访问设备的联系人信息。

这时就可以使用ContentProvider来提供联系人数据库的访问功能。

首先,我们需要在文件中声明READ_CONTACTS权限。

然后,我们可以通过ContentResolver类来获取联系人信息,实现对联系人数据库的访问。

我们可以通过以下步骤来实现对联系人数据库的访问:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如ContactsProvider。

在ContactsProvider中,我们需要重写query、insert、update和delete方法,这些方法分别对应了查询、插入、更新和删除操作。

2. 在query方法中,我们可以构建合适的SQL语句,然后通过ContentResolver的query方法来执行查询操作,从而获取联系人信息。

3. 在insert方法中,我们可以通过ContentResolver的insert方法来执行插入操作,向联系人数据库中添加新的联系人信息。

4. 在update方法中,我们可以通过ContentResolver的update方法来执行更新操作,更新联系人数据库中的联系人信息。

5. 在delete方法中,我们可以通过ContentResolver的delete方法来执行删除操作,从联系人数据库中删除指定的联系人信息。

用中获取、添加、更新和删除联系人信息。

- ContentProvider示例二:媒体文件访问除了联系人数据库之外,我们还可以使用ContentProvider来实现对媒体文件的访问。

例如,我们可以访问设备上的音乐文件、视频文件和图片文件。

通过ContentProvider,我们可以实现对媒体文件的查询、插入、更新和删除操作。

要实现对媒体文件的访问功能,我们可以按照以下步骤进行操作:1. 首先,我们需要创建一个继承自ContentProvider的子类,例如MediaProvider。

androidmanifest的 provider用法

androidmanifest的 provider用法

androidmanifest的provider用法在Android开发中,<provider>元素用于在AndroidManifest.xml文件中声明一个Content Provider。

Content Provider是Android系统中共享数据的一种标准方式,它允许一个应用程序访问另一个应用程序中的数据,同时保持数据的封装性和安全性。

使用<provider>标签时,需要指定以下属性:1.authorities:这是一个字符串数组,定义了Content Provider的唯一标识。

这个标识通常以URI的形式表示,如"com.example.myapp.provider"。

:指定Content Provider的实现类的全限定名。

3.exported:布尔值,指示Content Provider是否可以被其他应用程序访问。

如果设置为true,则表示Content Provider可以被其他应用访问;如果为false,则只有同一个应用或具有相同用户ID的应用可以访问。

4.grantUriPermissions:布尔值,指示是否授予临时权限给调用者,以便它们可以对ContentProvider提供的数据执行读/写操作。

5.pathPattern 和pathPrefix:这些属性用于限制哪些路径可以通过Content Provider暴露出去。

6.readPermission 和writePermission:定义了访问Content Provider所需的权限。

7.meta-data:用于传递额外的信息给Content Provider。

例如,如果要在AndroidManifest.xml中声明一个FileProvider,可以按照以下步骤操作:1.在manifest中使用<provider>标签来指定FileProvider。

2.指定有效的文件路径,以便FileProvider可以为文件生成对应的Content URI。

ContentProvide

ContentProvide

一.Conent Provider用来保存和检索数据,并且使应用程序之间相互访问数据成为可能,它是跨应用程序共享数据的唯一方法。

二.Android提供了应用程序之间访问的统一接口,这些接口被定义在ContentProvide中,包括添加,删除,修改和查询等操作。

例:我们要发送一条短信,可能要用到联系人应用程序,从而选择要发送的人。

三.Content Provider的常用方法:ContentProvide定义在android.content包下面。

定义一个ContentProvide必须实现几个抽象的方法:query(uri,String[],String,String[],String)查询insert(Uri,ContentBValues)插入update(Uri,ContentValues,String,String[])更新delete(Uri,String,String)删除getType(Uri)获得MIME的数据类型四.ContentResolver我们是在ContentProvide中实现我们实际操作数据的方法的,但是客户端调用时,我们用到了另外一个接口,它就是ContentResolver。

ContnetResolver来操作ContentProvider 的。

五.1.ContentProvider是通过对象来进行共享数据2.一个URI对象必须以"content://"开头,接下来为URI的授权部分,这个部分内容要和androidMainifest.xml配置文件中声明的授权内容一致,后面还可有数据类型和记录Id。

通过URI 可以使得ContentResolver知道和那个ContentProvider对应,并且来操作那些表以及那个记录。

content://com.example.transportationprovider/trains//122六.创建ContentProvide的步骤:1.创建保存数据的文件或数据库2.定义一个类继承ContentProvide。

01 Content Provider概述

01  Content Provider概述
wwwmrbccdcom2uri的用法contentprovider使用基于数据库模型的简单表格来提供其中的数据这里每行代表一条记录每列代表特定类型和含义的数据
Content Provider概述
本讲大纲: 1、数据模型 2、URI的用法
支er使用基于数据库模型的简单表格来提供其中的数据, 这里每行代表一条记录,每列代表特定类型和含义的数据。例如,联 系人的信息可能以如下方式提供:
URI的用法
每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其 数据集。管理多个数据集(多个表格)的Content Provider为每个都提 供了单独的URI。所有为provider提供的URI都以“content://”作为前缀, “content://”模式表示数据由Content Provider来管理。
Thank you
还有什么疑问可以到提出 也可以以发送邮件到 mingrisoft@

Content Provider使用

Content Provider使用
mContacts,
columns, // 要返回的数据字段
null,
// WHERE子句
null, // WHERE 子句的参数
null // Order-by子句
);
if (cur.moveToFirst()) {
String name = null;
String phoneNo = null;
3. 创建你的数据存储系统。大多数Content Provider使用Android文件系 统或SQLite数据库来保持数据,但是你也可以以任何你想要的方式来存 储。
4. 定义你要返回给客户端的数据列名。如果你正在使用Android数据 库,则数据列的使用方式就和你以往所熟悉的其他数据库一样。但是, 你必须为其定义一个叫_id的列,它用来表示每条记录的唯一性。
录的MIME类型)
比如,
一个请求列车信息的URI如
content://com.example.transportationprovider/trains/122 可能就会返回
typevnd.android.cursor.item/vnd.example.rail这样一个MIME类型。
vnd.android.cursor.dir/vnd.yourcompanyname.contenttype (多个记录
删除记录: Content Provider中的getContextResolver.delete()方法可以用来删除记 录,下面的记录用来删除设备上所有的联系人信息:
private void deleteRecords() { Uri uri = People.CONTENT_URI;
getContentResolver().delete(uri, null, null); } 你也可以指定WHERE条件语句来删除特定的记录: getContentResolver().delete(uri, “NAME=” + “‘XYZ XYZ’”, null); 这将会删除name为‘XYZ XYZ’的记录。

ContentProvider使用详解

ContentProvider使用详解
g[] selectionArgs)
public int update(Uri uri, ContentValues values, S
tring selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection,
sMatcher.addURI("com.ljq.provider.personprovider", " person", 1);//添加需要匹配 uri,如果匹配就会返回匹配码
//如果 match()方法匹配 content://com.ljq.provider.perso
nprovider/person/230 路径,返回匹配码为 2,配 Uri 注册如下:
三、UriMatcher 类使用介绍 因为 Uri 代表了要操作的数据,所以我们经常需要解析 Uri,并从 Uri 中获取数 据。Android 提供了两个用于操作 Uri 的工具类,分别为 UriMatcher 和 ContentUris。 UriMatcher 类用于匹配 Uri,用法如下: 1、 首先需要把匹配的 Uri 路径全部进行注册,如下:
ContentProvider 删除数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于更新 ContentProvider 中的数据。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于从 ContentProvider 中获取数据。 这些方法的第一个参数为 uri,代表要操作的 ContentProvider 和对其中的什么数 据进行操作,假设给定的是: Uri.parse("content://com.ljq.providers.personprovider/person/10"),那么将会对 主机名为 com.ljq.providers.personprovider 的 ContentProvider 进行操作,操作的数 据为 person 表中 id 为 10 的记录。 使用 ContentResovler 对 ContentProvider 中的数据进行增删改查操作,如下:

ContentProvider详解

ContentProvider详解

ContentProvider详解⼏个概念:Cursor、 Content provider 、 Uri 、contentresolver1、Cursor :个⼈理解为数据库中的⼀⾏数据,它是每⾏数据的集合。

它是⼀个类。

通过它的⼀系列⽅法,我们可以对数据库中的每⾏进⾏定位,我们还可以知道每⼀列的信息。

⽐如:cursor(游标).moveToFirst(),表⽰定位到第⼀⾏,然后我们通过其他⽅法可以知道每列的名称,每列的数据类型等。

2、Content Provider :内容提供者,我们⼀个application中的其他类假如想操作数据库中的数据的话,就可以直接对此进⾏操作,⽽避免了对数据库进⾏直接操作,再说了,数据库这些个东西有权限要求的,我们不可能把数据库直接暴露出来,所以,通常采⽤这种形式。

其实他就是⼀个提供数据访问的⽹站,我们要访问它的话,就得知道他的域名。

android:authorities . 在minifest.xml中配置如下:(包含两个部分,name 与 anthorities)<provider android:name=".PersonProvider" android:authorities="com.sharpandroid.providers.personprovider"/>当某个应⽤,可能是外部的,可以通过这两个属性来找到这个Content Provider了。

Content Provider ⽀持在多个应⽤中存储和读取数据。

这也是跨应⽤共享数据的唯⼀⽅式。

在android系统中,没有⼀个公共的内存区域,供多个应⽤共享存储数据。

3、Uri:这个东西就是提供者提供数据的详细地址,到底是哪些数据,⽤此来对数据进⾏过滤操作。

假如说,Content Provider是⼀个DNS,域名的话。

那么Uri可以认为是IP地址,我们通过此IP地址找到我们所需要的数据。

使用contentprovider 分享数据的步骤

使用contentprovider 分享数据的步骤

使用contentprovider 分享数据的步骤使用ContentProvider分享数据的步骤ContentProvider是Android中用于管理与其他应用程序共享数据的组件。

它提供了一种标准化的方式,让应用程序能够安全地发布和获取数据,而无需直接访问底层数据源。

以下是使用ContentProvider分享数据的一般步骤:1.设计数据结构和数据库模式:在开始使用ContentProvider之前,首先需要设计数据结构和确定数据库模式。

这包括确定数据表、字段以及数据表之间的关系。

在设计数据库时,应考虑到需要与其他应用程序共享的数据类型和关联。

2.创建ContentProvider类:创建一个类继承自Android提供的ContentProvider基类。

该类负责管理数据的发布和获取,它必须实现一组标准的CRUD(Create, Read, Update, Delete)方法,以便其他应用程序可以执行数据操作。

3.定义URI:URI(Uniform Resource Identifier)用于标识要操作的数据资源。

在ContentProvider中,URI通常由以下几个部分组成:authority、path和optional ID。

authority是ContentProvider的唯一标识符,path用于指定资源的类型,optional ID是可选的资源ID。

根据具体需求,可以定义多个URI 以满足不同的操作。

4.实现CRUD方法:根据设计的数据结构和数据库模式,实现ContentProvider 中的CRUD方法。

这些方法包括insert、query、update和delete,分别对应数据的插入、查询、更新和删除操作。

可以根据不同的URI来处理不同的数据操作。

5.注册ContentProvider:在AndroidManifest.xml文件中注册ContentProvider。

在<application>标签下添加<provider>标签,并设置ContentProvider的authority属性以及其他属性,如读写权限等。

Android13_IPC方式之ContentProvider

Android13_IPC方式之ContentProvider

Android13_IPC⽅式之ContentProviderContentProvider是安卓提供的专门⽤于不同应⽤间进⾏数据共享的⽅式;它天⽣适合进程间通信;和Messenger⼀样,ContentProvider的底层实现同样也是Binder;ContentProvider还是四⼤组件之⼀;其实ContentProvider的使⽤涉及的细节还是很多的;⼀般来讲ContentProvider⽤于对应⽤的数据库进⾏增删改查;我们可以访问跨应⽤地其他应⽤提供的ContentProvider,也可以⾃定义⼀个ContentProvider;⾃⼰实现ContentProvider要⾃定义⼀个类继承⾃ContentProvider并实现六个抽象⽅法:onCreate、query、update、insert、delete、getType;1、⾸先在Manifest中注册ContentProvider组件:android:autorities 是作为标识,⼀般⽤完整包名加类名android:permission 表⽰权限,其他应⽤想要⽤这个ContentProvider时,继续声明该权限才可以,否则外界应⽤会异常终⽌;android:process 这⾥为了演⽰⽅便,直接在同⼀个应⽤中开启多进程模式,MainActivity⼀个进程,ContentProvider⼀个进程;2、编写DbOpenHelper类这个类⽤于管理数据的创建、升级、降级package com.example.learncontentprovider;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;//利⽤SQLiteHelper来管理数据库的创建、升级、降级public class DbOpenHelper extends SQLiteOpenHelper {private static final String TAG = "DbOpenHelper";private static final String DB_NAME = "book_provider.db";public static final String BOOK_TABLE_NAME="book";public static final String USER_TABLE_NAME="user";private static final int DB_VERSION = 1;//建表语句图书和⽤户信息表private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "+BOOK_TABLE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT)";private String CREATE_USER_TABLE="CREATE TABLE IF NOT EXISTS "+USER_TABLE_NAME+"(_id INTEGER PRIMARY KEY,"+"name TEXT,"+"sex INT)";public DbOpenHelper(Context context){super(context,DB_NAME,null,DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {Log.d(TAG,"onCreate");db.execSQL(CREATE_BOOK_TABLE);db.execSQL(CREATE_USER_TABLE);}//⽤于对数据库进⾏升级的,是否执⾏该⽅法要看DbOpenHelper构造函数传⼊的version是否⽐之前更⼤。

contentprovide用法

contentprovide用法

contentprovide用法ContentProvide是Android平台上的一个组件,用于为应用程序提供数据访问的能力。

在本文中,将逐步回答关于ContentProvide的使用方法。

第一步:了解ContentProvider的基本概念和作用ContentProvider是Android中提供数据访问的组件之一,它允许应用程序共享和访问数据,从而实现多个应用程序之间的数据共享。

ContentProvider提供了一种标准化的方式来访问和管理数据,使得应用程序可以通过URI(Uniform Resource Identifier)来查询、插入、更新和删除数据。

第二步:创建一个ContentProvider类要使用ContentProvider,首先需要创建一个继承自android.content.ContentProvider类的自定义ContentProvider类。

这个类负责处理数据的访问请求,并提供数据给其他应用程序。

第三步:实现ContentProvider的必要方法自定义ContentProvider类需要实现以下几个重要的方法:- onCreate():在ContentProvider被创建时调用,用于初始化一些资源和数据库的连接。

- query():用于处理查询数据库的请求,并返回查询结果。

- insert():用于处理向数据库中插入数据的请求,并返回插入的URI。

- update():用于处理更新数据库的请求,并返回更新的行数。

- delete():用于处理删除数据库记录的请求,并返回删除的行数。

- getType():根据URI返回相应的数据类型。

第四步:在AndroidManifest.xml文件中注册ContentProvider在使用ContentProvider之前,需要在AndroidManifest.xml文件中对其进行注册。

使用<provider>元素进行注册,指定自定义ContentProvider类的名称、权限和数据访问URI。

android content provider 的用法

android content provider 的用法

android content provider 的用法Android Content Provider是一种用于数据共享和跨应用访问的组件,它允许应用程序将数据存储在一个中央存储库中,并且其他应用程序可以通过Content Provider来访问和操作这些数据。

Content Provider是Android四大组件之一。

下面是使用Android Content Provider的一般步骤:1. 创建Content Provider类:创建一个类来扩展android.content.ContentProvider,并实现其中的抽象方法。

2. 定义URI和数据表:为Content Provider定义数据表和对应的URI,URI用于唯一标识Content Provider中的数据集。

3. 初始化Content Provider:在Content Provider的onCreate()方法中进行初始化操作,例如创建数据库,获取数据库连接等。

4. 处理URI匹配和数据查询:在Content Provider的query()方法中处理传入的URI和查询参数,然后执行查询操作,返回Cursor对象,包含查询结果。

5. 执行数据插入:在Content Provider的insert()方法中处理传入的URI和要插入的数据,然后执行插入操作。

6. 执行数据更新:在Content Provider的update()方法中处理传入的URI和要更新的数据,然后执行更新操作。

7. 执行数据删除:在Content Provider的delete()方法中处理传入的URI和要删除的数据,然后执行删除操作。

8. 内容 URI 解析:使用ContentResolver类来解析和处理getContentResolver()方法返回的内容URI,从而获得Content Provider返回的数据。

content provider详解

content provider详解

内容提供者-Content ProviderContent providers管理对结构化数据集的使用.它们封装数据,并提供了数据安全的机制.Content providers是从一个进程连接另一个进程中的数据的标准接口.当你想使用一个content provider中的数据,你需在你的应用的Context 中使用ContentResolver对象作为客户端与provider 进行通讯.C ontentResolver对象与provider对象通讯,provider是实现ContentProvider的类.Provider对象接收客户端发来的请求,执行请求的动作,返回结果.如果你不想把你的数据共享给其它应用,你不需开发你自己的provider.然而,你需要自己的provider来在你的应用中提供自定义搜索建议.如果你需要从你的应用中考贝复杂的数据或文件粘贴到其它应用中,你也需要提供自己的provider.Android自己包含了管理音频,视频,图像,个人通讯录等数据的content providers.你可以从android.provider 包的参考文档中爪到它们.这些providers 可以被所有的android 应用使用,但可能带有一些限制.Content Provider 基础一个content provider 管理对中央数据仓库的使用.一个provider是一个Android应用的一部分,应用一般提供它自己的UI来操作数据.然而,content providers主要是为了给其它应用使用,其它的应用使用provider客户端对象来操作provider.providers 和provider 客户端一起提供了一致的,标准的接口来操作用于进程间通讯的数据并保处数据的安全性.本节讲解以下基础知识:· content providers如何工作.·从content provider取得数据的API.·向content provider插入,更新以及删除数据的API.·其它有助于使用providers的API.概述一个content provider代表了面向外部应用的数据,这些数据看起来就像关系型数据库中的一个或多个table.一行代表某种数据类型的一个实例,一列代表这个实例的一个属性或字段.举个例子,Android平台中的一个内建的provider是用户词典,它存储了用户想保存的非标准词的拼写.表1 演示了数据在provider的表中可能看起来的样子:Table 1:简单用户词典表在上表中,每行代表了一个不能在标准字典中找到的词.每一列代表了这个词了一个属性.列头是存储在provider中的列的名字.要引用一行的locale属性,需引用locale列.对于这个provider,_ID列作为"主键"列,provider会自动管理它.注:一个provider不是必须具备主键的,并且也不是必须使用_ID作为主键的列名来引用一行.然而,如果你把一个provider绑定到一个ListView,就必须有一个列名叫做_ID.此需求将在显示查询结果一节中有详细的解释.操作一个provider应用使用ContentResolver客户端对象来操作content provider中的数据.此对象具有一些与provider 对象中同名的方法,provider对象指的是某个ContentProvider具体派生类的实例.ContentResolver的方法们提供了对存储数据的基本的"CRUD" (增删改查)功能.ContentResolver对象处于客户端应用的线程中,ContentProvider对象位于另外的进程并且自动处理进程间通讯.ContentProvider也代表了数据层与可视层之间的一个抽象层.注:要使用一个provider,你的应用通常需要在manifest请求一些权限, 这将在Content Provider 权限一节中进行更详细的讲解.举个例子,要从用户词典Provider中获取取单词和它们的locale列表,你需调用ContentResolver.query().query() 方法会调用用户词典中的ContentProvider.query() 方法.下面的代码演示了ContentResolver.query() 调用:// 查询用户词典并返回结果mCursor = getContentResolver().query(UserDictionary.Words.CONTENT_URI, // 单词表的content URImProjection, // 每行要返回的列们mSelectionClause // Selection的条件mSelectionArgs, // Selection的条件mSortOrder); // 返回各行要如何排序表2展示了query(Uri,projection,selection,selectionArgs,sortOrder)的参数们如何与一个SQL SELECT语句匹配:Table 2: Query() 与SQL 查询的对比Content URIscontent URI 是一个标志provider中的数据的URI.Content URI中包含了整个provider的以符号表示的名字(它的authority) 和指向一个表的名字(一个路径).当你调用一个客户端的方法来操作一个provider中的一个表,指向表的content URI是参数之一.常量CONTENT_URI 中包含了用户词典table的content URI.ContentResolver 对象分析出URI的authority,并使用它与一个已知provider组成的系统表中的authority进行对比来"解决"provider.ContentResolver之后就会派送查询参数给正确的 provider.ContentProvider使要长content URI的路径辨别分来选择要操作的表.通常一个provider 中要暴露的每个表都具有一个路径.在上面的例子的代码中,"词典"表的全URI是:content://user_dictionary/wordsuser_dictionary部分是provider的 authority,words部分是表的路径.字符串 content:// (the scheme) 总是要存在,它表示引用一个content URI.很多provider允许你通过在URI的末尾增加一个ID来操作表中一个单独的行.例如,要从用户词典中获取_ID是4的一行,你可要行使用这样的content URI:Uri singleUri = ContentUri.withAppendedId(UserDictionary.Words.CONTENT_URI,4);当你要获取多行然后更新或删除其中一时,你经常要使用的是id值.注:Uri和Uri.Builder类包含由字符串构建格式正确的Uri对象的简便的方法们.ContentUris 包含向一个URI添加id值的简便方法们.上面的小代码片段就是使用了withAppendedId() 来向UserDictionary content URI添加id.从Provider取得data本节讲述了如何从provider取得数据,使用用户词典作为例子.为了清析易懂,本节中调用ContentResolver.query()的代码片断置于"UI 线程"中.但是,在实际代码中,你应该在另一个线程执行查询动作,这样做的一种方法是使用CursorLoader 类.而,那几行示例代码仅是片断,它们不能展示一个完整的应用.要从provider取得data,须依如下步骤:1 请求provider的读权限.2 定义发送请求到provider的代码.请求读权限要从一个provider中获取数据,你的应用需要对目标provider具有"读权限".你不能在运行时请求此权限,而只能在manifest文件中使用<uses-permission>元素指定你的权限需求.当你在manifest中指定此元素时,你实际上就是在为你的应用请求这个权限.当用户安装你的应用时,就表示同意了这个权限请求.要找到你使用的provider读权限的所对应的准确名字,以及其它用于provider的权限的名字,请浏览provider的文档.关于操作provider的权限的角色的更多信息,请见Content Provider权限一节.用户词典Provider在它的manifest 中定义了android.permission.READ_USER_DICTIONARY权限,所以一个想读取它内容的应用必须请求此权限.构建请求获取数据的下一步是构建一个请求(query).这里的第一个代码片段定义了一些用于操作用户词典Provider的变量:// "projection" 定义了要返回的各列们String[]mProjection ={UserDictionary.Words._ID,// Contract class constant for the _ID column name UserDictionary.Words.WORD,// Contract class constant for the word column name UserDictionary.Words.LOCALE // Contract class constant for the locale column name };// 定义一个包含"select"条款的字符串String mSelectionClause =null;// 初始化一个包含"select"参数的字符串String[]mSelectionArgs ={""};下一个代码片段演示了如何使用ContentResolver.query(),将用户词典Provider作为一个例子.一个provider客户端查询极像一个SQL查询,它包含了要返回的一坨column们,一堆筛选条件,和一个排序方式.查询返回的column集合被称作projection (变量mProjection).指定返回的列的语句被分解为选择条款和选择参数两部分.选择条款是逻辑和布尔表达式,列名以及值的组合体(变量mSelection).如果你在其中指定了使用?来代表一个值,查询方法就会从选择参数部分取得这个值(变量mSelectionArgs).在下一个代码片段中,如果用户没有输入单词,选择条款就被设为null,并且查询会反回所provider中所有的单词.如果用户输入了单词,选择条款就被设置为UserDictionary.Words.Word + " = ?"并且选择参数(数组)的第一项被设置为用户输入的单词./** 定义一个一维的字符串数组来容纳选择参数们*/String[]mSelectionArgs ={""};// 从界面中获取一个单词mSearchString =mSearchWord.getText().toString();// 记住要在此插插入代码检查不合法的或恶意的输入.// 如果单词是空的,则获取所有数据if(TextUtils.isEmpty(mSearchString)){// 设置选择条款为null就会返回所有单词mSelectionClause =null;mSelectionArgs[0]="";}else{// 构造一个匹配用户输入的单词的选择条款mSelectionClause =" = ?";// 将用户输入的单词置于选择参数中mSelectionArgs[0]=mSearchString;}// 执行查询并返回游标对象mCursor =getContentResolver().query(UserDictionary.Words.CONTENT_URI,// The content URI of the words table mProjection,// The columns to return for each rowmSelectionClause // Either null, or the word the user enteredmSelectionArgs,// Either empty, or the string the user enteredmSortOrder);// The sort order for the returned rows// 有些provider在出错时返回null,有抛出异常if(null==mCursor){/** 在此插入代码处理错误.记住不要使用游标! 你可能要调用* android.util.Log.e()把错误记录的日志**/// 如果游标是空的,找不到匹配的provider}else if(mCursor.getCount()<1){/** 在此插入代码来通知用户,查找不成功.这也不能完全算是个错误.你可能想为用户提供插入一个新行或重新输入查询单词的选项*/}else{// 在此插入代码,利用返回的结果做想做的事}查询与下面的SQL语句等价:SELECT _ID,word,frequency,locale FROM words WHERE word =<userinput>ORDER BY word ASC;在此SQL 语句中,以实际的列名代替了内置的类别常量.防止恶意输入如果被content provider管理的数据是一个SQL 数据库,在原始的SQL语句中包含不可信的数据会导致SQL注入.思考以下选择条款:// 通过连接用户输入到列名来构造一个选择条款String mSelectionClause ="var = "+mUserInput;如果你这样做,你就允许用户连接恶意的SQL语句到你的SQL语句中.例如,用户可以输入"nothing; DROP TABLE *;" ,这将在选择条款中变为var = nothing; DROP TABLE *;..既然选择条款被作为SQL语句,这就可能导致provider删除SQLite数据库中的所有的表(除非provider被设置成捕获SQL injection阴谋).要避免此问题,应使用一个运用?作为可替换参数的选择条款和一个作为选择参数的数组.当你这样做时,用户输入被直接绑定到查询而不是被解释为SQL语句的一部分.因为它不被认为是SQL,于是用户输入就不能注入恶意SQL.使用以下选择条款来代替连接用户输入的那个:// 构造一个带有占位符的选择条款String mSelectionClause ="var = ?";像这样建立起选择参数数组:// 定义一个数组来容纳选择参数String[]selectionArgs ={""};像这样把一个值置入选择参数数组中:// Sets the selection argument to the user's inputselectionArgs[0]=mUserInput;一个使用?作为占位符的选择条款+一个选择参数数组是指定一个选择器的最佳方式,即使provider不是基于SQL数据库的.显示查询结果客户端方法ContentResolver.query()总是返回一个包含所查询的列们的Cursor.一个Cursor对象提供了随机的读取它所包含的行和列的能力.使用Cursor的方法们,你可以迭代结果中的行,决定每列的数据类型,从列获得数据,以及检测结果的其它属性.一些Cursor的实现会在provider的数据改变时自动更新,或在Cursor改变时触发监听者的方法,或者两者都支持.注:一个provider可能跟据构建查询的对象的性质限制对某些列的操作.例如,联系人Provider会禁止同步适配器操作某些列,所以它不会把它们返回给一个activity或service.如果没有符合选择条件的行,provider返回一个Cursor对象,其Cursor.getCount()为0 (一个空cursor).如果一个内部错误发生,查询结果会因provider的不同而不同.它可能返回null,也可能抛出一个Exception.既然一个Cursor是行组成的"列表",那么一个和显示Cursor内容的好方法就是把它链接到一个ListView上,通过SimpleCursorAdapter.下面的代码片段是衔接前面的代码来的.它创建一个SimpleCursorAdapter对象,包含有查询返回的Cursor,然后设置这个对象为ListView的适配器.// 定义要从Cursor取出的并要加载到view中的列们String[]mWordListColumns ={UserDictionary.Words.WORD,// Contract class constant containing the word column nameUserDictionary.Words.LOCALE // Contract class constant containing the locale colum n name};// 定义一个View ID组成的列表,它们将接收每行的Cursor列的值int[]mWordListItems ={R.id.dictWord,R.id.locale};// Creates a new SimpleCursorAdaptermCursorAdapter =new SimpleCursorAdapter(getApplicationContext(),// The application's Context objectyout.wordlistrow,// ListView的一行的layoutmCursor,// The result from the querymWordListColumns,// A string array of column names in the cursormWordListItems,// An integer array of view IDs in the row layout0);// Flags (usually none are needed)// 将适配器设置给ListViewmWordList.setAdapter(mCursorAdapter);注:要使Cursor支持ListView,cursor必须包含一个叫做_ID的列,因此,上面所示的查询从"单词"表中取出了_ID,当然ListView可以不显示它.这条限制同时也解释了为毛大多数provider在它们的表中都具有一个_ID列.从查询结果中获取数据你可以使用查询结果做更多是事情,而不是仅简单地显示它们.比如,你可以从用户词典中获取拼法然后在其它provider中查找它们.要这样做,你需在Cursor中迭代所有的行.// 获取叫做"word"的列的序号int index =mCursor.getColumnIndex(UserDictionary.Words.WORD);/** 仅在cursor有效时执行下面语句.如果发生内部错误,用户词典Provider返回null. * 其它provider可能抛出一个异常而不是返回null.*/if(mCursor !=null){/** 移到cursor中的下一行.在第一次移动之前,* "行指针" 为-1,并且,如果你想获取那个位置的数据,你将得到一个异常*/while(mCursor.moveToNext()){// 从列中获取值.newWord =mCursor.getString(index);// 在此插入代码处理获取到的单词...// 循环结束}}else{// 如果cursor为null或前面抛出了异常,在处插入代码报告错误.}Cursor的实现包含了多个"get" 方法,用于从对象中获取不同类型的数据.例如,前面的代码片段使用getString().它们也具有一个getType()方法,用它可以返回的值代表了数据的类型.Content Provider的权限一个具有provider的应用可以指定其它要操作自己的数据所应具有的权限.这些权限保证了用户能了解一个应用将要操作那个数据.其它应用需基于provider的需求请求相应的权限.用户在安装应用时会看到它们所请求的权限.如果一个provider的应用没有指定任务权限,那么其它应用就不能操作provider的数据.然而,provider所在的应用的组件们却具有完整的读写权限,而不管是否指定了权限.如上面所提到的,用户词典Provider需要android.permission.READ_USER_DICTIONARY 权限来从它取得数据.Provider具有另一个android.permission.WRITE_USER_DICTIONARY权限,代表了插入,更新或删除的权限.要获取操作一个provider的权限,应用需在自己的manifest文件中使用<uses-permission>元素.当Android包管理器安装这个应用时,用必须批准所有的权限请求.如果用户批准了所有的权限请求,包管理器会继续安装这个应用;如果没有,包管理器就会取消安装过程.下面的<uses-permission>元素请求对用户词典的读权限:<uses-permission android:name="android.permission.READ_USER_DICTIONARY"> Provider操作权限的作用在指南安全和权限一节中有详细的描述.插入更新删除数据用从provider取得数据相同的方法,你也可以让provider 客户端与provider的ContentProvider以交互方式修改数据.你调用个ContentResolver的方法,其参数是要传给ContentProvider对应方法的.Provider与provider客户端自动处理安全问题和进程间通信问题.插入数据要向一个provider中插入数据,需调用ContentResolver.insert()方法.此方法插入一个新行到provider中并且返回一个代表这一行的content URI.下面的代码片段演示了如何将一个新行插入到用户词典中:// 定义一个新的Uri对象,用于接收插入后的返回值Uri mNewUri;...// 定义一个对象来包含要插入的值们ContentValues mNewValues = new ContentValues();/** 设置要插入行的每列的值."put"方法的参数是"column name"和"value"*/mNewValues.put(UserDictionary.Words.APP_ID, "er");mNewValues.put(UserDictionary.Words.LOCALE, "en_US");mNewValues.put(UserDictionary.Words.WORD, "insert");mNewValues.put(UserDictionary.Words.FREQUENCY, "100");mNewUri = getContentResolver().insert(UserDictionary.Word.CONTENT_URI, // 用户词典的content URImNewValues // 要插入的值们);新行的数据被置入一个ContentValues对象,就像构建一个单行cursor.对象中的列们不必都是相同的数据类型,并且如果你不想指定某列的值,你可以设置一个列为null ,使用ContentValues.putNull().此代码片段中没有添加_ID 列,因为此列是被自动维护的.Provider会为每个添加的新行分配一个唯一的_ID 值.Provider总是把它用作表的主键.返回的content URI newUri 代表了新添加的行,以下面的形式:content://user_dictionary/words/<id_value><id_value> 是新行的 _ID 的值.大多数可以自动检测content URI 的格式然后执行对此行的请求的操作.要从返回的Uri,获得_ID 的值,调用ContentUris.parseId().更新数据要更新一行,你可以使用一个ContentValues对象,向它填充要更新的值,就像你插入时做的,并且选择条件跟查询时是一样的.你应使用的客户端方法是ContentResolver.update().你只需把要更新的列的值添加到ContentValues对象.如果你想去清空一列的内容,设置其值为null.下面的片段改变所有语言列中带有"en"的行,把其locale置为null.返回值表明了多少行被更新:// 定义一个对象包含要更新的数据ContentValues mUpdateValues = new ContentValues();// 为要更新的行们定义选择条款String mSelectionClause = UserDictionary.Words.LOCALE + "LIKE ?";String[] mSelectionArgs = {"en_%"};// 定义一个变量存放更新的行的数量.int mRowsUpdated = 0;.../** 设置更新的值并且更新选择的单词*/mUpdateValues.putNull(UserDictionary.Words.LOCALE);mRowsUpdated = getContentResolver().update(UserDictionary.Words.CONTENT_URI, // the user dictionary content URImUpdateValues // the columns to updatemSelectionClause // the column to select onmSelectionArgs // the value to compare to);删除数据删除行与获取行的方式相似:你为想要更新的行指定选择条款,然后客户端方法就会返回被删除的行数.下面的代码片段删除那些appid等于"user"的行们.返回被删除的行数.// 定义要删除的行们的选择条款String mSelectionClause = UserDictionary.Words.APP_ID + " LIKE ?";String[] mSelectionArgs = {"user"};// 定义一个存放删除的行数的变量int mRowsDeleted = 0;...// 删除那些符合选择条款的单词们mRowsDeleted = getContentResolver().delete(UserDictionary.Words.CONTENT_URI, // the user dictionary content URImSelectionClause // the column to select onmSelectionArgs // the value to compare to);。

Android开发中的数据存储和访问方法详解(八)

Android开发中的数据存储和访问方法详解(八)

Android开发中的数据存储和访问方法详解在Android开发中,数据的存储和访问是非常重要的。

无论是临时变量,用户设置,还是应用程序的数据,我们都需要有效地管理和处理这些数据。

本文将详细介绍Android开发中常用的数据存储和访问方法。

一、Shared Preferences(共享偏好设置)Shared Preferences是Android提供的一种轻量级的数据存储方式,适用于简单的键值对数据。

通过Shared Preferences可以有效地存储用户的设置信息,如语言偏好、主题颜色等。

使用Shared Preferences时,需要先获取一个SharedPreferences对象,然后通过该对象对数据进行读写操作。

SharedPreferences提供了一系列的putXXX()和getXXX()方法,可以方便地存储和读取各种类型的数据。

二、Internal Storage(内部存储)Internal Storage是Android中应用程序的私有存储空间,存储在设备的内部存储中。

这种存储方式适用于一些敏感的数据,只有应用程序本身可以访问到这些数据。

使用Internal Storage时,可以通过Context类提供的openFileOutput()和openFileInput()方法对文件进行读写操作。

在应用程序被卸载时,Internal Storage中的数据也会被删除。

三、External Storage(外部存储)External Storage是指设备上的公共存储空间,如SD卡。

它适用于存储一些大型文件、缓存数据以及与其他应用程序共享数据。

在使用External Storage之前,需要在文件中添加相应的权限声明。

通过Environment类提供的getExternalStorageDirectory()方法可以获取外部存储的根目录,然后可以通过File类进行具体的文件操作。

四、SQLite数据库SQLite数据库是一种轻量级的关系型数据库,适用于存储结构化数据。

contentprovider 使用实例

contentprovider 使用实例

一、什么是contentproviderContentProvider是Android中的四大组件之一,用于管理应用程序的私有数据并提供对这些数据的访问权限。

通过ContentProvider,应用程序之间可以共享数据,并且可以实现数据的增删改查等操作。

二、ContentProvider的基本使用1. 创建ContentProvider要创建一个ContentProvider,需要继承自android.content.ContentProvider类,并实现其中的一些方法,包括onCreate(), query(), insert(), update(), delete()等方法。

在AndroidManifest.xml文件中需要注册ContentProvider,声明该Provider所管理的数据的URI。

2. 数据库操作在ContentProvider中,一般会使用SQLite数据库来存储数据。

在实现query(), insert(), update(), delete()等方法时,需要使用SQLiteOpenHelper来创建、打开、关闭数据库,并使用SQLiteDatabase对象进行数据的增删改查操作。

3. ContentResolver的使用在应用程序中,通过ContentResolver来访问ContentProvider提供的数据。

ContentResolver是一个用于访问ContentProvider的核心类,它可以通过ContentProvider所提供的URI来操作相应的数据。

4. 权限控制在ContentProvider中,可以通过权限控制来限制其他应用程序对数据的访问。

可以在AndroidManifest.xml中声明ContentProvider所需要的权限,并在ContentProvider的实现中对权限进行验证。

三、ContentProvider的使用示例下面以一个简单的学生信息管理系统为例,演示ContentProvider的基本使用。

contentprovide例子

contentprovide例子

"Content Provider"通常指的是在应用程序中提供和管理数据的组件。

在Android开发中,Content Providers是一种标准机制,允许不同的应用程序共享数据。

以下是一个简单的Content Provider 的例子:```javapublic class SimpleProvider extends ContentProvider {private static final String TAG = "SimpleProvider";private static final String DATABASE_NAME = "database.db";private static final int DATABASE_VERSION = 1;private static final String TABLE_NAME = "table";private static final String ID_COLUMN = "_id";private static final String VALUE_COLUMN = "value";private DBHelper dbHelper;@Overridepublic boolean onCreate() {dbHelper = new DBHelper(getContext());}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {SQLiteDatabase db = dbHelper.getReadableDatabase(); String finalSelection = selection == null ? null : selection + " AND " + ID_COLUMN + " > ?";return db.query(TABLE_NAME, projection, finalSelection, selectionArgs, null, null, sortOrder);}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbHelper.getWritableDatabase(); long id = db.insert(TABLE_NAME, null, values);Uri newUri = ContentUris.withAppendedId(uri, id);getContext().getContentResolver().notifyChange(newUri, null);}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.update(TABLE_NAME, values, selection, selectionArgs);getContext().getContentResolver().notifyChange(uri, null);return count;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbHelper.getWritableDatabase(); int count = db.delete(TABLE_NAME, selection, selectionArgs);getContext().getContentResolver().notifyChange(uri, null);}@Overridepublic String getType(Uri uri) {return null; // 这个方法在实际开发中可能不会被调用,但在实现时应该返回合适的MIME类型。

一起学Android之ContentProvider

一起学Android之ContentProvider

一起学Android之ContentProvider本文主要讲解在Android开发中ContentProvider的常规用法,仅供学习分享使用,如有不足之处,还请指正。

访问一个ContentProvider在Android开发中,应用程序通过ContentResolver(内容解析器)从ContentProvider(内容提供者)中获取数据,ContentResolver提供访问ContentProvider中同名方法,ContentProvider包括ContentProvider和它的子类,ContentResolver对ContentProvider的持久层存储提供了基本的CRUD (Create,Retrieve,Update,Delete)方法进行访问。

客户端App的ContentResolver对象自动处理和ContentProvider的App之间的进程间通信。

ContentProvider还充当数据库和外部数据视图表现之间的抽象层。

备注:如果要访问一个ContentProvider,App需要在清单文件中请求对应的权限。

例如:从User Dictionary Provider中获取单词和区域的列表,可以调用ContentResolver.query()方法,如下图所示:1 // 查询用户定义字典并返回结果2 mCursor = getContentResolver().query(3 UserDictionary.Words.CONTENT_URI, // 单词表的内容URI4 mProjection, // 查询的数据列名数组5 mSelectionClause //查询条件,可以为null6 mSelectionArgs, // 查询参数,可以为null7 mSortOrder); // 返回数据对象的排序条件下表显示了query(Uri,projection,selection,selectionArgs,sortOrder) 如何与SQL语句进行匹配:Content URIsContent URI是Provider中标识数据的URI,包括整个Provider (其权限)的符号名和指向表(或路径)的名称,Content URI是访问ContentProvider的参数之一。

androidprovider使用解析

androidprovider使用解析

androidprovider使⽤解析⼀、基本概念Android四⼤组件之⼀ content provider,它主要的作⽤是:实现各个应⽤程序之间的(跨应⽤)数据共享。

在这⾥涉及到进程通信问题,⾃然在Android中使⽤的是binder来进⾏,但是由于content provider提供的数据量⼀般都⽐较⼤不能够直接进⾏传递。

所以这⾥采⽤的是⼀种叫做匿名共享内存的⽅式进⾏数据传递,在不同的进程中只需要传递⼀个⽂件描述符就可以。

通过下图对content provider有个⽐较直观的了解:ContentProvider提供了在应⽤程序之前共享数据的⼀种机制。

1)存储和获取数据提供了统⼀的接⼝。

2)对数据进⾏封装,不⽤关⼼数据存储的细节。

3)Android为常见的⼀些数据提供了默认的ContentProvider(包括⾳频、视频、图⽚和通讯录等)。

⼆、content provider的定义如果需要使⽤content provider⾸先需要在AndroidManifest中进⾏申明<provider android:authorities="list"//该provider的唯⼀IDandroid:directBootAware=["true" | "false"]android:enabled=["true" | "false"] // 能否被系统实例化android:exported=["true" | "false"] //该provider能否被其他应⽤使⽤android:grantUriPermissions=["true" | "false"]android:icon="drawable resource"android:initOrder="integer"android:label="string resource"android:multiprocess=["true" | "false"]android:name="string"android:permission="string"android:process="string"android:readPermission="string"//读权限android:syncable=["true" | "false"]android:writePermission="string" > //写权限. . .</provider>注意在provider的属性中最重要的是 authorities,它是唯⼀能够标识⼀个provider,contentprovider通过URI中的地址来查找到对应的provider,其中该URI就包含了需要寻找的provider中的authorities属性值。

contentprovider和contentredolver的实例 -回复

contentprovider和contentredolver的实例 -回复

contentprovider和contentredolver的实例-回复ContentProvider和ContentResolver是Android中用于实现数据共享和数据访问的重要组件。

ContentProvider提供数据,并且支持对数据的增加、删除、修改和查询操作,而ContentResolver则负责对数据进行访问和操作。

本文将一步一步详细介绍ContentProvider和ContentResolver的使用方法和实例。

一、ContentProvider的使用方法和实例1. 创建ContentProvider要创建一个ContentProvider,需要继承ContentProvider类,并实现以下几个重要方法:onCreate、query、insert、update和delete。

下面是一个简单的示例:javapublic class MyContentProvider extends ContentProvider { private static final String AUTHORITY ="com.example.mycontentprovider";private static final Uri CONTENT_URI = Uri.parse("content:" + AUTHORITY + "/person");在此进行一些初始化操作@Overridepublic boolean onCreate() {return true;}查询数据@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {执行查询操作,返回Cursor}插入数据@Overridepublic Uri insert(Uri uri, ContentValues values) {执行插入操作,返回新插入数据的Uri}更新数据@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {执行更新操作,返回受影响的行数}删除数据@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {执行删除操作,返回受影响的行数}返回ContentProvider的MIME类型@Overridepublic String getType(Uri uri) {根据传入的Uri返回对应的MIME类型}}2. 注册ContentProvider在AndroidManifest.xml文件中注册ContentProvider,需要指定authority和path属性,示例如下:xml<providerandroid:name=".MyContentProvider"android:authorities="com.example.mycontentprovider"android:exported="true"android:readPermission="com.example.permission.READ"android:writePermission="com.example.permission.WRITE"> </provider>3. 使用ContentProvider使用ContentProvider的关键是借助ContentResolver类。

react 中context.provider使用

react 中context.provider使用

react 中context.provider使用在React中,Context提供了一种在组件之间共享值的方法,它可以在不需要手动将props 逐层传递的情况下共享数据。

要使用Context,需要先创建一个Context对象,可以通过React.createContext()函数来创建。

创建Context对象后,我们可以在其上方定义一个Provider组件,该组件包装了应用程序的顶层组件,并将要共享的数据作为value传递。

下面是使用Context的示例代码:javascriptCopy code// 创建Context对象const MyContext = React.createContext();// 定义Provider组件function MyProvider(props) {const [state, setState] = useState('Hello');return (<MyContext.Provider value={{ state, setState }}>{props.children}</MyContext.Provider>);}// 定义使用Context的组件function MyComponent() {return (<MyContext.Consumer>{({ state, setState }) => (<div><p>{state}</p><button onClick={() => setState('World')}>Click Me</button></div>)}</MyContext.Consumer>);}// 渲染组件function App() {return (<MyProvider><MyComponent /></MyProvider>);}ReactDOM.render(<App />, document.getElementById('root'));在上面的代码中,我们创建了一个名为MyContext的Context对象,并定义了一个MyProvider 组件,将要共享的数据作为value传递。

adb shell content provider 参数

adb shell content provider 参数

adb shell content provider 参数adb shell content provider是一个命令行工具,用于与Android 设备上的内容提供者(Content Provider)进行交互。

这个命令允许你查询、插入、更新或删除内容提供者中的数据。

下面是adb shell content provider命令的一些常见参数:1.query:用于查询内容提供者中的数据。

o语法:adb shell content provider <URI> <projection>o示例:adb shell content providercontent://com.example.provider/table1 SELECT _id, name 2.insert:用于向内容提供者中插入数据。

o语法:adb shell content provider <URI> <values>o示例:adb shell content providercontent://com.example.provider/table1 {name=John,age=30}3.update:用于更新内容提供者中的数据。

o语法:adb shell content provider <URI> <values> <where> o示例:adb shell content providercontent://com.example.provider/table1 {name=Jane,age=35} WHERE _id=14.delete:用于删除内容提供者中的数据。

o语法:adb shell content provider <URI> <where>o示例:adb shell content providercontent://com.example.provider/table1 WHERE _id=15.export:用于将内容提供者的数据导出为JSON 或XML 格式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、Content Provider 简介
我们说Android应用程序的四个核心组件是:Activity、Service、Broadcast Receiver 和Content Provider。

在Android中,应用程序彼此之间相互独立的,它们都运行在自己独立的虚拟机中。

Content Provider 提供了程序之间共享数据的方法,一个程序可以使用Content Provider 定义一个URI,提供统一的操作接口,其他程序可以通过此URI访问指定的数据,进行数据的增、删、改、查。

二、使用现成的Content Provider
我们举一个读取Android系统通讯录提供的Content Provider为例,说明如何使用现成的Content Provider。

1、新建一个项目Lesson20_ContentProvider项目。

2、res/layout/main.xml内容省略,就是制作一个查询按钮。

3、MainContentProvider.java的内容如下:
01 package android.basic.lesson20;
02
03 import android.app.Activity;
04 import android.content.ContentResolver;
05 import android.content.ContentValues;
06 import android.database.Cursor;
07 import .Uri;
08 import android.os.Bundle;
09 import android.provider.ContactsContract;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.widget.Button;
13 import android.widget.Toast;
14
15 public class MainContentProvider extends Activity {
16
17 /** Called when the activity is first created. */
18 @Override
19 public void onCreate(Bundle savedInstanceState) {
20 super.onCreate(savedInstanceState);
21 setContentView(yout.main);
22
23 Button b1 = (Button) findViewById(R.id.Button01);
24
25 OnClickListener ocl = new OnClickListener() {
26
27 @Override
28 public void onClick(View v) {
29 ContentResolver contentResolver = getContentResolver();
30 // 获得所有的联系人
31 Cursor cursor =
contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
32 // 循环遍历
33 if (cursor.moveToFirst()) {
34
35 int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
36
37 int displayNameColumn =
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
38
39 do {
40 // 获得联系人的ID号
41 String contactId = cursor.getString(idColumn);
42
43 // 获得联系人姓名
44 String disPlayName = cursor.getString(displayNameColumn);
45
46 Toast.makeText(MainContentProvider.this, "联系人姓名:"+disPlayName,
47 Toast.LENGTH_LONG).show();
48
49 // 查看该联系人有多少个电话号码。

如果没有这返回值为0
50 int phoneCount =
cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
51
52 if (phoneCount > 0) {
53
54 // 获得联系人的电话号码列表
55 Cursor phonesCursor =
getContentResolver().query(monDataKinds.Phone.CONTENT_URI,null,
56 monDataKinds.Phone.CONTACT_ID
57 + " = " + contactId, null, null);
58
59 if (phonesCursor.moveToFirst()) {
60 do {
61 // 遍历所有的电话号码
62 String phoneNumber = phonesCursor
63 .getString(phonesCursor
64 .getColumnIndex(monDataKinds.Phone.NUMBER));
65 Toast.makeText(MainContentProvider.this, "联系人电话:"+phoneNumber,
66 Toast.LENGTH_LONG).show();
67 } while (phonesCursor.moveToNext());
68 }
69 }
70
71 } while (cursor.moveToNext());
72 }
73 }
74 };
75
76 b1.setOnClickListener(ocl);
77 }
78
79 }
4、运行程序,查看结果
系统通讯录中的联系人信息
我们的程序读取出来的联系人信息三、定义自己的Content Provider (待续)。

相关文档
最新文档