Android入门(49)——第四章 四大组件之ContentProvider

1. 简介:


上面的几种方法有问题,所以用ContentProvider:


2. 案例一:手机联系人存储和联系人读取两个应用程序:

File Expoler --- data --- data --- com.android.providers.contacts --- database --- contacts2.db(系统联系人数据库)

下载以后可以通过第三方软件查看该数据库,该数据库中包含很多的表,表的内容出于安全性是不会让你轻易看懂的:


3. 因此我们就需要用ContentProvider来进行对数据的增删查改:

第一点:如何实现ContentProvider:


package com.imooc.contentproviderdemo1;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;

// 自己写一个类来继承ContentProvider,第三方对你的数据的访问权限,完全取决于你当前这个继承类里面写了什么功能
public class MyContentProvider extends ContentProvider{
	
	/*
	 * 根据Uri删除selection指定的条件所匹配的全部记录
	 * */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

	/*
	 * 返回当前uri的MIME类型.
	 * 如果该URI对应的数据可能包括多条记录,那么MIME类型字符串 就是以vnd.android.dir/开头
	 * 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头
	 * */
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * 根据Uri插入Values对应的数据
	 * */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * 在ContetnProvider创建后被调用
	 * */
	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		return false;
	}

	/*
	 * 根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序
	 * */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * 根据uri修改selection指定的条件所匹配的全部记录
	 * */
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

}


第二点:何为Uri?


第三点:UriMatche类:


第四点:ContentResolver:


第五点:这里说的相同签名的四个方法指的是这四个方法的它们对应在ContentProvider和ContentResolver类中的参数完全相同:



4. 案例一:


注意:自定义ContentProvider对于新手来说实际意义不大,现在只要学好系统提供的ContentProvider即可。


第一步:

添加联系人访问权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.imooc.contentproviderdemo1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="10" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.imooc.contentproviderdemo1.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>

</manifest>
第二步:直接在MainActivity中写:

package com.imooc.contentproviderdemo1;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Contacts.Data;
import android.util.Log;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 获取ContentResolver对象
		ContentResolver cr = getContentResolver();
		// 查询,第一个参数是Uri,这个值是已经给我们写死的。返回值也是一个游标:
		Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID,
				Contacts.DISPLAY_NAME }, null, null, null);
		if (c != null) {
			while (c.moveToNext()) {
				int id = c.getInt(c.getColumnIndex("_id"));
				Log.i("info", "_id:" + id);
				// 这个display_name如果名字不知道,可以直接用上面的那个:DISPLAY_NAME
				Log.i("info",
						"name:" + c.getString(c.getColumnIndex("display_name")));
				Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {
						Phone.NUMBER, Phone.TYPE },
						Phone.CONTACT_ID + "=" + id, null, null);
				// 根据联系人ID查询出联系人的电话号码
				if (c1 != null) {
					while (c1.moveToNext()) {
						int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
						if (type == Phone.TYPE_HOME) {
							Log.i("info",
									"家庭电话:"
											+ c1.getString(c1
													.getColumnIndex(Phone.NUMBER)));
						} else if (type == Phone.TYPE_MOBILE) {
							Log.i("info",
									"手机:"
											+ c1.getString(c1
													.getColumnIndex(Phone.NUMBER)));
						}
					}
					c1.close();
				}
				// 根据联系人的ID去查询出联系人的邮箱地址
				Cursor c2 = cr.query(Email.CONTENT_URI, new String[] {
						Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id,
						null, null);
				if (c2 != null) {
					while (c2.moveToNext()) {	// Data.MIMETYPE应该是Data.Type或者Emile.DATA
						int type = c2.getInt(c2.getColumnIndex(Data.MIMETYPE));
						if (type == Email.TYPE_WORK) {
							Log.i("info",
									"工作邮箱:"
											+ c2.getString(c2
													.getColumnIndex(Data.MIMETYPE)));
						}
					}
					c2.close();
				}
			}
			c.close();
		}
	}

}
效果图:受宠若惊啊


5. 案例二:添加联系人:

第一步:添加权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.imooc.contentproviderdemo2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="10" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.imooc.contentproviderdemo2.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>

</manifest>
第二步:写MainActivity:

package com.imooc.contentproviderdemo2;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ContentResolver cr =  getContentResolver();
        //向联系人中 插入一行数据
        ContentValues values = new ContentValues();
       Uri uri =  cr.insert(RawContacts.CONTENT_URI, values);
       Long raw_contact_id = ContentUris.parseId(uri);
       values.clear();
       //插入人名
       values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
       values.put(StructuredName.DISPLAY_NAME, "张三三");
       values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
       // 向电话簿增加张三三这个人
       uri = cr.insert(Data.CONTENT_URI, values);
       //插入电话信息
       values.clear();
       values.put(Phone.RAW_CONTACT_ID,raw_contact_id);
       values.put(Phone.NUMBER,"13333333333");
       values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
       uri = cr.insert(Data.CONTENT_URI, values);
    }
}
效果图:受宠若惊:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值