当前位置:操作系统 > 安卓/Android >>

Android开发——监听内容提供者ContentProvider的数据变化

 

一、提出需求

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

 

 

二、示例代码

[java] 
/**
 * 对内容提供者进行操作
 * 
 * @author XY
 * 
 */ 
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; 
 
/**
 * @author XY
 * 
 */ 
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); 
     

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,