黑马程序员技术交流社区
标题:
浅谈Content Provider
[打印本页]
作者:
woying123
时间:
2015-12-6 01:43
标题:
浅谈Content Provider
一.Content Provider的概念介绍
Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享。是应用程序间共享数据的唯一途径。Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。其中包括添加,删除,查询,更新等操作。
在Content Provider使用过程中,还需要借用ContentResolver对象间接来操作ContentProvider来获取数据。ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentResolver是单实例的,但是可以有多个ContentResolver在不用的应用程序和不同的进程之间和ContentResolver交互。
二.Content Provider的简介
1.Content Provider的常用方法
//查询
query(Uri, String[], String, String[], String);
//插入
insert(Uri, ContentValues);
//更新
update(Uri, ContentValues, String, String[]);
//删除
delete(Uri, String, String[]);
//获得MIME数据类型
getType(Uri);
2.数据模型
Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。
_ID
NUMBER
NUMBER_KEY
LABEL
NAME
TYPE
13
(425) 555 6677
425 555 6677
Kirkland office
Bully Pulpit
TYPE_WORK
44
(212) 555-1234
212 555 1234
NY apartment
Alan Vain
TYPE_HOME
45
(212) 555-6657
212 555 6657
Downtown office
Alan Vain
TYPE_MOBILE
53
201.555.4433
201 555 4433
Love Nest
Rex Cars
TYPE_HOME
3.URI
URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。Content Provider就是通过URI对象来共享其数据的。
URI的格式图如下:
各个部分的组成:
A:标准前缀,是固定的,"content://"是用来标识数据是由Content Provider管理的 schema。
B:URI的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称
C:需要访问的数据字段名称。
D:如果URI中包含表示需要获取的记录的_ID;如何有D部分,则就返回该_ID对应的数据,否则表示返回整张表的数据
三.Content Provider实例
Anroid系统自带的Content Provider对象
获得系统联系人信息(姓名和手机号码)的例子
MainActivity.java
package com.lingdududu.provide;
import android.app.Activity;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.database.Cursor;
import android.graphics.Color;
import android.widget.TextView;
import android.content.ContentResolver;
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
String string = getQueryData();
// 设置文本的颜色
tv.setTextColor(Color.BLUE);
// 设置TextView显示的内容
tv.setText(string);
//设置文本字体的大小
tv.setTextSize(30.0f);
// 显示到屏幕
setContentView(tv);
}
public String getQueryData(){
String string = "";
// 得到ContentResolver对象
ContentResolver cr = getContentResolver();
// 取得电话本中开始一项的光标
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
// 向下移动光标
while (cursor.moveToNext()) {
// 取得联系人名字
int nameFieldColumnIndex = cursor
.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String contact = cursor.getString(nameFieldColumnIndex);
// 取得电话号码
String ContactId = cursor.getString(cursor
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
+ ContactId, null, null);
while (phone.moveToNext()) {
String PhoneNumber = phone
.getString(phone
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
string += (contact + ":" + PhoneNumber + "\n");
}
}
cursor.close();
return string;
}
}
注意:记得在AndroidManifest.xml加上17行的权限声明
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lingdududu.provide"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
</manifest>
通讯录中联系人的信息:
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2