android第十七步采用ContentProvider对外共享数据

继承自ContentProvider

清单文件添加

 <provider android:name="com.example.contentprovider.PersonContentProvider" //包地址
                  android:exported="true"  //是否与其他应用交互
                  android:authorities="zhao.providers.personprovider"></provider> //访问地址

UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH)

MATCHER.addURI("zhao.providers.personprovider", "person", persons); //不带ID
MATCHER.addURI("zhao.providers.personprovider", "person/#", person);//带ID

public class PersonContentProvider extends ContentProvider {

    private DBOpenHelper dbOpenHelper;
    public static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int persons =1;
    private static final int person =2;
    static{
        MATCHER.addURI("zhao.providers.personprovider", "person", persons);
        MATCHER.addURI("zhao.providers.personprovider", "person/#", person);
    }
    
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        SQLiteDatabase database=dbOpenHelper.getWritableDatabase();
        int num = 0;
        switch(MATCHER.match(arg0))
        {
        case persons:
            num = database.delete("person", arg1, arg2);
            break;
        case person:
            long rowid= ContentUris.parseId(arg0);
            String where = "personid="+rowid;
            if(arg1!=null && !"".equals(arg1.trim())){
                where+=where+" and "+arg1.trim();
            }
            num = database.delete("person", where, arg2);
            break;
        }
        return 0;
    }

    @Override
    public String getType(Uri arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri arg0, ContentValues arg1) {
        SQLiteDatabase database=dbOpenHelper.getWritableDatabase();
        switch(MATCHER.match(arg0)){
        case persons:
            long rowid = database.insert("person", "name", arg1);
            Uri uri = ContentUris.withAppendedId(arg0, rowid);
            this.getContext().getContentResolver().notifyChange(arg0, null);
            return uri;
            
        default:
            throw new IllegalArgumentException("this is Unknown Uri:"+ arg0);
        }
    }

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

    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
            String arg4) {
        SQLiteDatabase database=dbOpenHelper.getReadableDatabase();
        switch(MATCHER.match(arg0)){
        case persons:
            return database.query("person", arg1, arg2, arg3,null,null, arg4);
        case person:
            long rowid = ContentUris.parseId(arg0);
            String where = "personid="+rowid;
            if(arg2!=null && "".equals(arg2)){
                where += " and "+arg2;
            }
            return database.query("person", arg1, where, arg3,null,null,arg4);
        }
        return null;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        SQLiteDatabase database = dbOpenHelper.getWritableDatabase();
        int num =0;
        switch(MATCHER.match(arg0)){
        case persons:
            num = database.update("person", arg1, arg2, arg3);
            break;
        case person:
            long rowid = ContentUris.parseId(arg0);
            String where = "personid="+rowid;
            if(arg2!=null && !"".equals(arg2)){
                where+=" and "+arg2;
            }
            num =database.update("person", arg1, where, arg3);
            break;
            
        }
        return num;
    }

}

如何访问这里使用其他应用访问

public void textdelete()
    {
        Uri uri = Uri.parse("content://zhao.providers.personprovider/person/41");
        ContentResolver resolver = this.getContext().getContentResolver();
        resolver.delete(uri, null, null);
    }
    public void testinsert()
    {
        Uri uri = Uri.parse("content://zhao.providers.personprovider/person");
        ContentResolver resolver = this.getContext().getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", "haha");
        values.put("phone", "123123123");
        values.put("amount", "123123123");
        resolver.insert(uri, values);
    }
    public void testupdate(){
        Uri uri = Uri.parse("content://zhao.providers.personprovider/person/42");
        ContentResolver resolver = this.getContext().getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", "caomang");
        resolver.update(uri, values, null, null);
    }
    public void testselect(){
        Uri uri = Uri.parse("content://zhao.providers.personprovider/person/42");
        ContentResolver resolver = this.getContext().getContentResolver();
        Cursor cursor = resolver.query(uri, null, null, null, null);
        while(cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex("name"));
            Log.i("1", name);
        }
        cursor.close();
    }

 数据变更通知

数据共享端

this.getContext().getContentResolver().notifyChange(arg0, null);
发出数据变化通知
public Uri insert(Uri arg0, ContentValues arg1) {
        SQLiteDatabase database=dbOpenHelper.getWritableDatabase();
        switch(MATCHER.match(arg0)){
        case persons:
            long rowid = database.insert("person", "name", arg1);
            Uri uri = ContentUris.withAppendedId(arg0, rowid);
            //第二次参数是设置必须获得通知的应用
            this.getContext().getContentResolver().notifyChange(arg0, null); //发出数据变化通知
            return uri;
            
        default:
            throw new IllegalArgumentException("this is Unknown Uri:"+ arg0);
        }
    }

APP B接受变化端

构造方法 public void ContentObserver(Handler handler)  

                 说明:所有   ContentObserver的派生类都需要调用该构造方法

        参数: handler  Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。

 常用方法

   void onChange(boolean selfChange)

       功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。

       参数:selfChange 回调后,其值一般为false,该参数意义不大(我也不懂,理解方法最重要)。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Uri uri = Uri.parse("content://zhao.providers.personprovider/person");
     第二个参数true表示要监控所有以uri为前缀的URI对应的数据变化
this.getContentResolver().registerContentObserver(uri, true, new PersonContentOberver(new Handler())); } private class PersonContentOberver extends ContentObserver{ public PersonContentOberver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } @Override public void onChange(boolean selfChange) { Uri uri = Uri.parse("content://zhao.providers.personprovider/person"); Cursor cursor= getContentResolver().query(uri, null, null, null, "personid desc limit 1"); if(cursor.moveToFirst()){ Log.i("zhaoyilong", cursor.getString(cursor.getColumnIndex("name"))); } } }

 

posted @ 2014-03-27 10:37  东方小花猪  阅读(288)  评论(0编辑  收藏  举报