07 - 数据操作三:ContentProvider内容提供者以及通讯录操作 组件2 ContentProvider

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);
	}
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值