zoukankan      html  css  js  c++  java
  • Android开发14——监听内容提供者ContentProvider的数据变化

    一、提出需求

    有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。

    二、示例代码

    A应用

    public class MainActivity extends Activity
    {

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
     }

     public void insert(View v)
     {
      Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
      ContentResolver resolver = this.getContentResolver();
      ContentValues values = new ContentValues();
      values.put("name", "xy_new_new");
      values.put("phone", "xy_new_111");
      resolver.insert(uri, values);
     }
    }


    B应用
    package cn.xy.cotentProvider.app.providers;
    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;
    import cn.xy.cotentProvider.service.DBOpeningHelper;


    public class PersonProvider extends ContentProvider
    {
     private DBOpeningHelper dbHelper;

     // 若不匹配采用UriMatcher.NO_MATCH(-1)返回
     private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

     // 匹配码
     private static final int CODE_NOPARAM = 1;
     private static final int CODE_PARAM = 2;

     static
     {
      // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式
      // 匹配返回CODE_NOPARAM,不匹配返回-1
      MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);

      // #表示数字 cn.xyCompany.providers.personProvider/person/10
      // 匹配返回CODE_PARAM,不匹配返回-1
      MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);
     }

     @Override
     public boolean onCreate()
     {
      dbHelper = new DBOpeningHelper(this.getContext());
      return true;
     }

     
     @Override
     public Uri insert(Uri uri, ContentValues values)
     {
      SQLiteDatabase db = dbHelper.getWritableDatabase();
      switch (MATCHER.match(uri))
      {
       case CODE_NOPARAM:
        // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列
        long id = db.insert("person", "name", values);
        Uri insertUri = ContentUris.withAppendedId(uri, id);
        // 发出变化通知(非必须)设监听者为null。
        // 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知
        getContext().getContentResolver().notifyChange(uri, null);
        return insertUri;
       default:
        throw new IllegalArgumentException("this is unkown uri:" + uri);
      }
     }
     ......
    }


    C应用
    package cn.xt.contentProvider.lisenter;
    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;
    import android.util.Log;

    public class MainActivity extends Activity
    {
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
      ContentResolver resolver = this.getContentResolver();
      resolver.registerContentObserver(uri, true, new PersonContentObserver(new Handler()));
     }

     private class PersonContentObserver extends ContentObserver
     {
      public PersonContentObserver(Handler handler)
      {
       super(handler);
      }

      // 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变
      @Override
      public void onChange(boolean selfChange)
      {
       // select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)
       Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
       ContentResolver resolver = MainActivity.this.getContentResolver();
       Cursor cursor = resolver.query(uri, null, null, null, "id desc limit 1");
       if(cursor.moveToFirst())
       {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        Log.i("lisenter", name);
       }
      }
     }
    }

    关于contentProvider的基本使用,请参看本博客博文《Android开发13——内容提供者ContentProvider的基本使用》

     http://blog.sina.com.cn/s/blog_67aaf444010162bj.html

  • 相关阅读:
    java并发之CountDownLatch
    在字符串中找出连续最长的数字串
    201301 JAVA题目0-1级
    linux vi 快捷键
    并行流水线、搜索、排序
    JDK中的Future模式
    Disruptor
    Unsafe类 AtomicReference AtomicStampedReference AtomicIntegerArray AtomicIntegerFieldUpdater vector SynchronousQueue
    java 虚拟机 分区 及 GC
    java 虚拟机对锁对优化
  • 原文地址:https://www.cnblogs.com/chen110xi/p/3247344.html
Copyright © 2011-2022 走看看