ContentProvider再学习:注册观察者

来源:互联网 发布:plc编程会用到哪些函数 编辑:程序博客网 时间:2024/05/22 03:09
package cn.itcast.db.provider;import cn.itcast.db.MyDBOpenHelper;import cn.itcast.db.dao.PersonDBDao;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.util.Log;public class PersonProvider extends ContentProvider {// 创建了一个路径的识别器 uriMatcher 默认的返回值,如果没有找到匹配的类型  返回 -1;public static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);public static final int ALL_PERSONS = 1;public static final int PERSON = 2;public static final int HAHA =3;public static final int INSERT =4;public static final int DELETE =5;public static final int UPDATE =6;private static final String TAG = "PersonProvider";MyDBOpenHelper openHelper;Uri baseuri = Uri.parse("content://cn.itcast.db.personprovider");static {matcher.addURI("cn.itcast.db.personprovider", "persons", ALL_PERSONS);// 指定一个路径的匹配规则 //如果路径 满足 content://cn.itcast.db.provider/persons 返回值就是( ALL_PERSONS) 1 matcher.addURI("cn.itcast.db.personprovider", "person/#",PERSON );//如果路径 满足 content://cn.itcast.db.provider/person/10 返回值就是( PERSON) 2matcher.addURI("cn.itcast.db.personprovider", "haha", HAHA);matcher.addURI("cn.itcast.db.personprovider", "insert", INSERT);matcher.addURI("cn.itcast.db.personprovider", "delete", DELETE);matcher.addURI("cn.itcast.db.personprovider", "update", UPDATE);}/** * PeronProvder 内容提供者第一次被创建的时候 调用的方法  */@Overridepublic boolean onCreate() {openHelper = new MyDBOpenHelper(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {int result = matcher.match(uri);switch (result) {// 符合 content://cn.itcast.db.provider/persons 代表的返回所有的数据 case ALL_PERSONS:PersonDBDao dao = new PersonDBDao(getContext());return  dao.findAllbyCursor();//content://cn.itcast.db.provider/person/10case PERSON:long id = ContentUris.parseId(uri);SQLiteDatabase db = openHelper.getReadableDatabase();if(db.isOpen()){Cursor cursor = db.query("person", null, "personid=?", new String[]{id+""}, null, null, null);return cursor;}case HAHA:Log.i(TAG,"我是haha对应的路径 ");break;default:throw new IllegalArgumentException("uri 不能被识别 ");}return null;}/** * 有的时候 我们需要知道内容提供者返回的数据类型  * 知道返回的数据 是一个集合呀 还是一个单独的条目  *  * 有的时候 告诉调用者 返回的数据是什么样的类型  * mime的数据类型 */@Overridepublic String getType(Uri uri) {int result = matcher.match(uri);switch (result) {// 符合 content://cn.itcast.db.provider/persons 代表的返回所有的数据 case ALL_PERSONS:return "vnd.android.cursor.dir/people";//content://cn.itcast.db.provider/person/10case PERSON:return "vnd.android.cursor.item/people";default :return null;}}@Overridepublic Uri insert(Uri uri, ContentValues values) {// content://cn.itcast.db.provider/insertint result = matcher.match(uri);switch (result) {case INSERT:SQLiteDatabase db = openHelper.getWritableDatabase();db.insert("person", "personid", values);// 当数据发生改变的时候 getContext().getContentResolver().notifyChange(baseuri, null);return uri;default:throw new IllegalArgumentException("uri 不能被识别 ");}}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int result = matcher.match(uri);switch (result) {case DELETE:SQLiteDatabase db = openHelper.getWritableDatabase();getContext().getContentResolver().notifyChange(baseuri, null);return db.delete("person", selection, selectionArgs);default:throw new IllegalArgumentException("uri 不能被识别 ");}}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int result = matcher.match(uri);switch (result) {case UPDATE:SQLiteDatabase db = openHelper.getWritableDatabase();getContext().getContentResolver().notifyChange(baseuri, null);return db.update("person", values, selection, selectionArgs);default:throw new IllegalArgumentException("uri 不能被识别 ");}}}


package cn.itcast.other;import android.app.Activity;import android.content.ContentResolver;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;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);                ContentResolver  resolver =  getContentResolver();        Uri uri = Uri.parse("content://cn.itcast.db.personprovider/");        //        Cursor cursor = resolver.query(uri, null, null, null, null);//        while (cursor!=null&& cursor.moveToNext()){//        String name = cursor.getString( cursor.getColumnIndex("name"));//        int age = cursor.getInt(cursor.getColumnIndex("age"));//        System.out.println("姓名 "+ name +" 年龄 "+ age);//        }               //  content://cn.itcast.db.personprovider        // 注册了一个内容观察者         getContentResolver().registerContentObserver(uri, true , new MyObserver(new Handler()));    }            public class MyObserver extends ContentObserver{public MyObserver(Handler handler) {super(handler);}/** * 当内容观察者发现了数据发生改变的时候 调用的方法  */@Overridepublic void onChange(boolean selfChange) {System.out.println("数据发生改变了 ");super.onChange(selfChange);}        }}

监听新短信:

package cn.itcast.smslistener;import android.app.Activity;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;public class DemoActivity 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://sms/");        getContentResolver().registerContentObserver(uri, true, new SmsObserver(new Handler()));    }        public class SmsObserver extends ContentObserver{public SmsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {System.out.println("有新的短信产生 ");Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"),null, null, null, null); while(cursor.moveToNext()){StringBuilder sb = new StringBuilder();sb.append("_id=").append(cursor.getInt(cursor.getColumnIndex("_id")));sb.append(",address=").append(cursor.getString(cursor.getColumnIndex("address")));sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));sb.append(";time=").append(cursor.getLong(cursor.getColumnIndex("date")));System.out.println(sb.toString());}super.onChange(selfChange);}    }}
遍历联系人和写入;联系人

package cn.itcast.contact;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;public class TestContact extends AndroidTestCase {public void getAllContactInfo() throws Exception{String rawbase = "content://com.android.contacts/raw_contacts";String database = "content://com.android.contacts/data";Cursor cursor = getContext().getContentResolver().query(Uri.parse(rawbase), null, null, null, null);while (cursor.moveToNext()) {String id  = cursor.getString( cursor.getColumnIndex("_id"));System.out.println("id ="+ id);Cursor datacursor = getContext().getContentResolver().query(Uri.parse(database), null, "raw_contact_id=?", new String[]{id}, null);while (datacursor.moveToNext()) {//String[]  names = datacursor.getColumnNames();//for(int i =0;i<names.length;i++){//System.out.println(names[i]);//}String type = datacursor.getString(datacursor.getColumnIndex("mimetype"));System.out.println(type);if("vnd.android.cursor.item/email_v2".equals(type)){String data1 = datacursor.getString( datacursor.getColumnIndex("data1"));System.out.println("邮箱 "+ data1);}else if("vnd.android.cursor.item/name".equals(type)){String data1 = datacursor.getString( datacursor.getColumnIndex("data1"));System.out.println("姓名 "+ data1);}else if("vnd.android.cursor.item/phone_v2".equals(type)){String data1 = datacursor.getString( datacursor.getColumnIndex("data1"));System.out.println("电话号码 "+ data1);}}datacursor.close();}cursor.close();}public void writeContact() throws Exception{String rawbase = "content://com.android.contacts/raw_contacts"; ContentValues values = new ContentValues(); Uri  uri = getContext().getContentResolver().insert(Uri.parse(rawbase), values); //返回的raw_contact 表中的_id long id = ContentUris.parseId(uri);  String database = "content://com.android.contacts/data"; ContentValues nameValues = new ContentValues(); nameValues.put("mimetype", "vnd.android.cursor.item/name"); nameValues.put("data1", "wangwu"); nameValues.put("raw_contact_id", id); getContext().getContentResolver().insert(Uri.parse(database), nameValues);  ContentValues phoneValues = new ContentValues(); phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2"); phoneValues.put("data1", "999999"); phoneValues.put("raw_contact_id", id); getContext().getContentResolver().insert(Uri.parse(database), phoneValues);  ContentValues emailValues = new ContentValues(); emailValues.put("mimetype", "vnd.android.cursor.item/email_v2"); emailValues.put("data1", "wangwu@sina.cn"); emailValues.put("raw_contact_id", id); getContext().getContentResolver().insert(Uri.parse(database), emailValues);//qq 同步助手// 号簿管家 -> 文件 -> 上传服务器 // pim 90多字段  体力活 }}