zoukankan      html  css  js  c++  java
  • 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 }

      

         

  • 相关阅读:
    Java学习——文件和IO流
    Java多线程——ThreadLocal类的原理和使用
    Java多线程——线程八锁案例分析
    Django 模版语法 一
    Django 命令行调用模版渲染
    Django 使用 locals() 函数
    Django 加载 app 中的urls
    Django 传递额外参数及 URL别名
    Django 无名参数与有名参数
    Django 项目中添加静态文件夹
  • 原文地址:https://www.cnblogs.com/tagie/p/3066088.html
Copyright © 2011-2022 走看看