Android基础4(内容提供者ContentProvider)

目录:

      1、内容提供者ContentProvider

      2、内容观察者

      3、短信监听器

      4、利用内容提供者操作联系人数据库

一、内容提供者:

     ContentProvider在android中的作用是对外共享数据,可以通过它将应用程序中的数据共享给其他应用使用,其他应用也可对数据进行操作。

     要实现应用的数据共享,需要继承ContentProvider类:

 

 1 package com.lewu.provider;
 2 
 3 import android.content.ContentProvider;
 4 import android.content.ContentValues;
 5 import android.database.Cursor;
 6 import android.net.Uri;
 7 
 8 public class MyProvider extends ContentProvider{
 9 
10     @Override
11     public boolean onCreate() {
12         return false;
13     }
14 
15     @Override
16     public Cursor query(Uri uri, String[] projection, String selection,
17             String[] selectionArgs, String sortOrder) {
18         return null;
19     }
20 
21     @Override
22     public String getType(Uri uri) {
23         return null;
24     }
25 
26     @Override
27     public Uri insert(Uri uri, ContentValues values) {
28         return null;
29     }
30 
31     @Override
32     public int delete(Uri uri, String selection, String[] selectionArgs) {
33         return 0;
34     }
35 
36     @Override
37     public int update(Uri uri, ContentValues values, String selection,
38             String[] selectionArgs) {
39         return 0;
40     }
41 
42 }

  第二步:在AndroidMainfest.xml中加入以下配置信息:

1  <provider android:name=".MyProvider" android:authorities="com.lewu.provider.myprovider"></provider>

 (1)URI介绍: 是访问其他应用的提供者的方式,相当于通过url去访问网页一样  

  content://com.lewu.provider.myprovider/person/10

 content为schema

 com.lewu.provider.myprovider:主机名或authority

 /peron/10为路径

  安卓中提供方法将字符串转换成URI   Uri.parse("content://com.lewu.provider.myprovider/person/10")

  第三步:完成MyProvider类共享数据

 1 package com.lewu.provider;
 2 
 3 import com.lewu.db.dao.PersonDao;
 4 
 5 import android.content.ContentProvider;
 6 import android.content.ContentValues;
 7 import android.content.UriMatcher;
 8 import android.database.Cursor;
 9 import android.net.Uri;
10 
11 public class MyProvider extends ContentProvider {
12 
13     private static UriMatcher match = new UriMatcher(UriMatcher.NO_MATCH);
14     private static Uri baseUri = Uri.parse("content://com.lewu.provider.myprovider");
15     private static final int ALL_PERSON = 1;
16     private PersonDao dao;
17 
18     static {
19         match.addURI("com.lewu.provider.myprovider", "person", ALL_PERSON);
20     }
21 
22     @Override
23     public boolean onCreate() {
24         dao = new PersonDao(getContext());
25         return false;
26     }
27 
28     @SuppressWarnings("unused")
29     @Override
30     public Cursor query(Uri uri, String[] projection, String selection,
31             String[] selectionArgs, String sortOrder) {
32         int type = match.match(uri);
33         switch (type) {
34         case ALL_PERSON:
35             if (selection != null && selectionArgs != null) {
36                 return dao.queryAllPerson(selection, selectionArgs);
37             } else {
38                 return dao.getCursor();
39             }
40         }
41         defualt:
42             throw new IllegalArgumentException("不能识别的uri");
43     }
44 
45     @Override
46     public String getType(Uri uri) {
47         return null;
48     }
49 
50     @Override
51     public Uri insert(Uri uri, ContentValues values) {
52         return null;
53     }
54 
55     @Override
56     public int delete(Uri uri, String selection, String[] selectionArgs) {
57         return 0;
58     }
59 
60     @Override
61     public int update(Uri uri, ContentValues values, String selection,
62             String[] selectionArgs) {
63         return 0;
64     }
65 
66 }

 

  通过UriMather类中addUril方法来配置访问指定数据的uri、

 

  第四步:在其他应用通过uri访问内容提供者(通过ContentResover类中的方法来访问)

1     ContentResolver resolver = getContext().getContentResolver();
2 
3         Uri uri = Uri.parse("content://com.lewu.provider.myprovider/person");
4 
5         Cursor cursor = resolver.query(uri, null, null, null, null);
6 
7         if (cursor.moveToFirst()) {
8             System.out.println("========");
9         }

 二、内容观察者

    1、ContentProvider访问者需要知道ContentProvider是否发生改变时,可以在ContentProvider发生改变时调用getContentResolver().notifyChange(uri,null)来通知注册在此uri上的访问者

    2、访问者要得到ContentProvider数据变化的通知,必须使用ContentObserver对数据进行监听,当监听到数据发生变化时,系统会调用ContentObserver中的onChange()方法

    如下:

 1 getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),
 2                 true, new PersonObserver(new Handler()));
 3 public class PersonObserver extends ContentObserver{
 4     public PersonObserver(Handler handler) {
 5         super(handler);
 6      }
 7     public void onChange(boolean selfChange) {
 8         //此处可以进行相应的业务处理
 9     }
10 }

三、短信监听(内容观察者的案例)

 android中存储短息和电话信息的数据库在com.android.providers.telephony目录下

 对短信进行监听 需要找到访问者注册监听的uri路径,寻找ContentProvider中notify方法中的uri即可

 短信监听者注册的uri路径为content://sms/

 1 package com.lewu.sms;
 2 
 3 import android.app.Activity;
 4 import android.database.ContentObserver;
 5 import android.database.Cursor;
 6 import android.net.Uri;
 7 import android.os.Bundle;
 8 import android.os.Handler;
 9 
10 public class SmsobserverActivity extends Activity {
11     @Override
12     public void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.main);
15         Uri uri = Uri.parse("content://sms/");
16         getContentResolver().registerContentObserver(uri, true,
17                 new MyObserver(new Handler()));
18     }
19 
20     @SuppressWarnings("unused")
21     private class MyObserver extends ContentObserver {
22 
23         public MyObserver(Handler handler) {
24             super(handler);
25         }
26 
27         @Override
28         public void onChange(boolean selfChange) {
29             
30             super.onChange(selfChange);
31             
32             System.out.println("短信内容发生了变化");
33             
34             Cursor cursor = getContentResolver().query(Uri.parse("content://sms/"), null, null, null, "date desc");
35             
36             while (cursor.moveToNext()) {
37                 String content = cursor
38                         .getString(cursor.getColumnIndex("body"));
39                 System.out.println(content);
40 
41             }
42         }
43 
44     }
45 }

 四、利用内容提供者操作联系人数据库

    联系人的数据库保存在com.addroid.provider.contacts目录下

    查看表结构可分析有如下的关联

    

 测试:

 1 package com.lewu.contect;
 2 
 3 import android.database.Cursor;
 4 import android.net.Uri;
 5 import android.test.AndroidTestCase;
 6 
 7 public class ContectTest extends AndroidTestCase {
 8 
 9     public void queryContect() {
10 
11         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
12 
13         Cursor cursor = getContext().getContentResolver().query(uri, null,
14                 null, null, null);
15 
16         while (cursor.moveToNext()) {
17 
18             String id = cursor.getString(cursor.getColumnIndex("_id"));
19             String name = cursor.getString(cursor
20                     .getColumnIndex("display_name"));
21 
22             System.out.println(name);
23 
24             Uri dataUri = Uri.parse("content://com.android.contacts/data");
25 
26             Cursor dataCursor = getContext().getContentResolver().query(
27                     dataUri, null, "raw_contact_id=?", new String[] { id },
28                     null);
29 
30             while (dataCursor.moveToNext()) {
31                 if ("vnd.android.cursor.item/phone_v2".equals(dataCursor
32                         .getString(dataCursor.getColumnIndex("mimetype")))) {
33                     System.out.println("电话"
34                             + dataCursor.getString(dataCursor
35                                     .getColumnIndex("data1")));
36                 } else if ("vnd.android.cursor.item/email_v2".equals(dataCursor
37                         .getString(dataCursor.getColumnIndex("mimetype")))) {
38                     System.out.println("邮箱"
39                             + dataCursor.getString(dataCursor
40                                     .getColumnIndex("data1")));
41                 }
42             }
43             dataCursor.close();
44         }
45         cursor.close();
46     }
47 
48 }

 

  

     

posted @ 2013-05-08 22:34  tagie  阅读(302)  评论(0编辑  收藏  举报