监听Content Provider中数据的变化

   说明:

       1、本系列博文是博主在学习传智播客Android培训视频的学习笔记

       2、当然博文不只是罗列视频上讲的知识点,通过查阅资料对一些知识点进行了详细的讲解

       3、由于是初学,难免有疏漏之处,还请不吝赐教       

 

        一、应用场景

        比如有两个应用A、B,它们同时共享内容提供者中的数据,当A应用向内容提供者中添加了一条数据要立刻通知B应用,这时候要怎么实现了?

        二、场景实现

        如果Content Provider的访问者需要知道ContentProvider中的数据变化,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri,null)来通知注册在此URI上的访问者,示例如下:

  
  
  
  
  1. public Uri insert(Uri uri, ContentValues values) {  
  2.         SQLiteDatabase db = helper.getWritableDatabase();  
  3.         if(MATCHER.match(uri)==PERSON_ALL){  
  4.             long rowid = db.insert("person""name", values);  
  5.             this.getContext().getContentResolver().notifyChange(uri, null);//发出数据变化通知  
  6.             return ContentUris.withAppendedId(uri, rowid);  
  7.         }else{  
  8.             throw new IllegalArgumentException("UnKnown uri"+uri);  
  9.         }  
  10.     } 

        如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化时,系统就会调用ContentObserver的OnChange()方法。所以访问者想要得到通知后进行相应就必须重写OnChange()方法,通过此方法来实现具体操作,比如说是仅仅通知一下还是要得到变化的具体数据,这些动作都必须在OnChange()方法中实现,示例如下:

  
  
  
  
  1. public class MainActivity extends Activity {  
  2.     /** Called when the activity is first created. */ 
  3.     @Override 
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");  
  8.         this.getContentResolver().registerContentObserver(uri, truenew PersonContentObserver(new Handler()));  
  9.     }  
  10.          
  11.     private class PersonContentObserver extends ContentObserver{  
  12.         public PersonContentObserver(Handler handler) {  
  13.             super(handler);  
  14.         }  
  15.      
  16.         @Override 
  17.         //onChange方法的具体实现[重要]  
  18.         public void onChange(boolean selfChange) {  
  19.             // select * from person order by personid desc limit 1  
  20.             Uri uri = Uri.parse("content://cn.itcast.providers.personprovider/person");  
  21.             Cursor cursor = getContentResolver().query(uri, nullnullnull"personid desc limit 1");  
  22.             if(cursor.moveToFirst()){  
  23.                 String name = cursor.getString(cursor.getColumnIndex("name"));  
  24.                 Log.i("MainActivity", name);  
  25.             }  
  26.         }  
  27.     }  

 

 

你可能感兴趣的:(android,监听,Provider,content)