1、定义内容提供者ContentProvider
AndroidManifest.xml 中注册组件
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<provider
android:authorities="com.yza.provider.personprovider"
android:name=".PersonProvider" />
<!-- android:authorities必须唯一 .Person 是因为与activity同一目录--> ....
实现内容
public class PersonProvider extends ContentProvider {
/*
* Uri: content://com.yza.provider.personprovider/person/10 [content] scheme
* 固定 【com.yza.provider.personprovider 】主机名称或android:authorities
* [/person/10] 数据库中person表的id为10 不一定数据库 /person/name 操作xml中person中name节点
*/
private DBhelper dbhelper;
private static final UriMatcher MATCHER = new UriMatcher(
UriMatcher.NO_MATCH);// 不匹配返回值
static {// 最后一个是匹配码
MATCHER.addURI("com.yza.provider.personprovider", "person", 1);
MATCHER.addURI("com.yza.provider.personprovider", "person/#", 2); // #代表数字
}
@Override
public boolean onCreate() { // 实例被创建示时候调用 只运行一次
dbhelper = new DBhelper(this.getContext());
return true;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int num = 0;
SQLiteDatabase db = dbhelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:// 删除所有
num = db.delete("person", selection, selectionArgs);
break;
case 2: // 删除指定id
long rowId = ContentUris.parseId(uri);
String where = "id=" + rowId;
if (selection != null && "".equals(selection.trim())) {
where += " and " + selection;
}
num = db.delete("person", where, selectionArgs);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri " + uri);
}
return num;
}
@Override
public String getType(Uri uri) { // 返回要操作的内容文件
switch (MATCHER.match(uri)) {
case 1:
return "vnd.android.cursor.dir/person";//开头是约定
case 2: // 删除指定id
return "vnd.android.cursor.item/person";//开头是约定
default:
throw new IllegalArgumentException("this is Unknown Uri " + uri);
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbhelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowid = db.insert("person", "name", values);// 主键
// Uri insertUri =
// Uri.parse("Uri: content://com.yza.provider.personprovider/person/"+rowid);
Uri insertUri = ContentUris.withAppendedId(uri, rowid);
this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知
return insertUri;
default:
throw new IllegalArgumentException("this is Unknown Uri " + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbhelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:// 更新所有
return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
case 2: // 更新指定id
long rowId = ContentUris.parseId(uri);
String where = "id=" + rowId;
if (selection != null && "".equals(selection.trim())) {
where += " and " + selection;
}
return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
default:
throw new IllegalArgumentException("this is Unknown Uri " + uri);
}
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int num = 0;
SQLiteDatabase db = dbhelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:// 更新所有
num = db.update("person", values, selection, selectionArgs);
break;
case 2: // 更新指定id
long rowId = ContentUris.parseId(uri);
String where = "id=" + rowId;
if (selection != null && "".equals(selection.trim())) {
where += " and " + selection;
}
num = db.update("person", values, where, selectionArgs);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri " + uri);
}
return num;
}
}
在其他应用中测试
public class AccessContentProviderTest extends AndroidTestCase {
public void testInsert() {
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/");
ContentResolver cr = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "laoli");
values.put("phone", "18622222222");
values.put("amount", "50000000");
cr.insert(uri, values);
}
public void testDelete() {
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/31");
ContentResolver cr = this.getContext().getContentResolver();
cr.delete(uri, null, null);
}
public void testUpdate() {
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/30");
ContentResolver cr = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "zhangxiaoxiao9527");
cr.update(uri, values, null, null);
}
public void testQuery() {
Uri uri = Uri.parse("content://com.yza.provider.personprovider/person");
ContentResolver cr = this.getContext().getContentResolver();
Cursor cur = cr.query(uri, null, null, null, "id asc");
while (cur.moveToNext()) {
String name = cur.getString(cur.getColumnIndex("name"));
Log.i("query", name);
}
}
}
2、内容提供者ContentProvider监听控制
A应用main.xml 定义方法
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button"
android:onClick="insert" />
public class AappActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void insert(View v) {
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/");
ContentResolver cr = this.getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "A-app");
values.put("phone", "18622222222");
values.put("amount", "9999");
cr.insert(uri, values);
}
}
另外一个应用中添加监听器
public class OtherActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/");
this.getContentResolver().registerContentObserver(uri, true,
new PersonContentObserver(new Handler()));
}
private class PersonContentObserver extends ContentObserver {
public PersonContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
// select * from person order by id desc limit 1
Uri uri = Uri
.parse("content://com.yza.provider.personprovider/person/");
Cursor cur = getContentResolver().query(uri, null, null, null,
"id desc limit 1");
if (cur.moveToFirst()) {
String name = cur.getString(cur.getColumnIndex("name"));
Log.i("Bapp", name);
}
}
}
}
3通过内容提供者操作通讯录
AndroidManifest.xml 添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
public class TestContacts extends AndroidTestCase {
// 获取所有
public void testQuery() throws Exception {
Uri uri = Uri.parse("content://com.android.contacts/contacts");
ContentResolver cr = getContext().getContentResolver();
Cursor cur = cr.query(uri, new String[] { "_id" }, null, null, null);
while (cur.moveToNext()) {
// Log.i("query", "bbbbbbbbb");
int contactId = cur.getInt(0);
StringBuilder sb = new StringBuilder();
sb.append(contactId);
uri = Uri.parse("content://com.android.contacts/contacts/"
+ contactId + "/data");
Cursor datacur = cr.query(uri, new String[] { "mimetype", "data1",
"data2" }, null, null, null);
while (datacur.moveToNext()) {
String type = datacur.getString(datacur
.getColumnIndex("mimetype"));
String data = datacur
.getString(datacur.getColumnIndex("data1"));
if ("vnd.android.cursor.item/name".equals(type)) {
sb.append(" ,name = " + data);
} else if ("vnd.android.cursor.item/phone_v2".equals(type)) {
sb.append(" ,phone = " + data);
} else if ("vnd.android.cursor.item/email_v2".equals(type)) {
sb.append(" ,email = " + data);
}
}
}
}
// 通过电话号码获取联系人
public void testContactByNumber() {
String number = "1367895245555";
Uri uri = Uri
.parse("content://com.android.contacts/data/phones/filter/"
+ number);
ContentResolver cr = getContext().getContentResolver();
Cursor cur = cr.query(uri, new String[] { "display_name" }, null, null,
null);
if (cur.moveToFirst()) {
String name = cur.getString(0);
Log.i("query", name);
}
}
// 添加联系人 存在事务不同步的问题
public void testAdd() {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver cr = getContext().getContentResolver();
ContentValues cv = new ContentValues();
long contactId = ContentUris.parseId(cr.insert(uri, cv));// raw_contacts表
// 联系人id
// 添加姓名
uri = Uri.parse("content://com.android.contacts/data");
cv.put("raw_contact_id", contactId);
cv.put("mimetype", "vnd.android.cursor.item/name");
cv.put("data2", "张晓晓");
cr.insert(uri, cv);
// 添加电话
cv.clear();
cv.put("raw_contact_id", contactId);
cv.put("mimetype", "vnd.android.cursor.item/phone_v2");
cv.put("data1", "18623455083");
cv.put("data2", "2"); // 2代表移动电话
cr.insert(uri, cv);
// 添加Email
cv.clear();
cv.put("raw_contact_id", contactId);
cv.put("mimetype", "vnd.android.cursor.item/email_v2");
cv.put("data1", "yongzhian@com");
cv.put("data2", "2"); // 2代表单位
cr.insert(uri, cv);
}
// 同一个事务添加
public void testAdd2() throws Exception {
Log.i("query", "bbbbbbbbb");
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver cr = getContext().getContentResolver();
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
.withValue("account_name", null).build();
operations.add(op1);// 第一个位置
uri = Uri.parse("content://com.android.contacts/data");
ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
// 使用第一个插入的返回值
.withValue("mimetype", "vnd.android.cursor.item/name")
.withValue("data2", "谢霆锋").build();
operations.add(op2);
ContentProviderOperation op3 = ContentProviderOperation
.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
// 使用第一个插入的返回值
.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
.withValue("data1", "1367895245555").withValue("data2", "2")
.build();
operations.add(op3);
ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
// 使用第一个插入的返回值
.withValue("mimetype", "vnd.android.cursor.item/email_v2")
.withValue("data1", "yonsgds").withValue("data2", "2").build();
operations.add(op4);
cr.applyBatch("com.android.contacts", operations);
}
}