Android-content-provider

1.Provider组件申请和实现
<!-- content provider组件申请 -->
        <provider android:name=".PersonProvider"
             android:authorities="cn.itcast.provider.personProvider"/>

//内容提供者,内容提供方
public class PersonProvider extends ContentProvider {

    private DBOpenHelper dbOpenHelper;
    private static final String base="cn.itcast.provider.personProvider"; 
    private static final UriMatcher Matcher=new UriMatcher(UriMatcher.NO_MATCH);
    private static final int persons=1;
    private static final int person=2;
    
    static{
        Matcher.addURI(base,"person",persons);
        //android中#代表数字,*代表所有字符
        Matcher.addURI(base,"person/#",person);
    }
    //服务初始化执行
    @Override
    public boolean onCreate() {
        dbOpenHelper=new DBOpenHelper(getContext());
        return true;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        int num=0;
        switch (Matcher.match(uri)){
        case persons:
            num=db.delete("person",selection,selectionArgs);
            return num;
        case person:
            long rowid=ContentUris.parseId(uri);
            String where="id="+rowid;
            if(selection!=null&&!"".equals(selection.trim())) 
                where+=" and "+selection;
            num=db.delete("person",where,selectionArgs);
            return num;
        default:
            throw new IllegalArgumentException("未知请求 :"+uri);
        }
    }

    @Override
    public String getType(Uri uri) {
        switch (Matcher.match(uri)){
        case persons:
            return "vnd.android.cursor.dir/person";
        case person:
            return "vnd.android.cursor.item/person";
        default:
            throw new IllegalArgumentException("未知请求 :"+uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        switch (Matcher.match(uri)){
        case persons:
            long rowid=db.insert("person","", values);//主键值
            Uri insertUri=Uri.parse("content://"+base+"/person/"+rowid);
            //ContentUris.withAppendedId(uri, rowid);
            //发出数据变化通知,第二个参数是必须获取到变化的接收者
            getContext().getContentResolver().notifyChange(uri, null);
            return insertUri;
        default:
            throw new IllegalArgumentException("未知请求 :"+uri);
        }
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        switch (Matcher.match(uri)){
        case persons:
            return db.query("person",projection, selection, selectionArgs,null,null,sortOrder);
        case person:
            long rowid=ContentUris.parseId(uri);
            String where="id="+rowid;
            if(selection!=null&&!"".equals(selection.trim())) 
                where+=" and "+selection;
            return db.query("person",projection,where, selectionArgs,null,null,sortOrder);
        default:
            throw new IllegalArgumentException("未知请求 :"+uri);
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        SQLiteDatabase db=dbOpenHelper.getReadableDatabase();
        int num=0;
        switch (Matcher.match(uri)){
        case persons:
            num=db.update("person",values,selection,selectionArgs);
            return num;
        case person:
            long rowid=ContentUris.parseId(uri);
            String where="id="+rowid;
            if(selection!=null&&!"".equals(selection.trim())) 
                where+=" and "+selection;
            num=db.update("person",values,where,selectionArgs);
            return num;
        default:
            throw new IllegalArgumentException("未知请求 :"+uri);
        }
    }

}
2.新建其他项目,测试调用项目的Provider
public class PersonContentProviderTest extends AndroidTestCase {

    //content provider 访问测试
    public void testInsert() throws Exception{
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person");
        ContentResolver resolver=getContext().getContentResolver();
        ContentValues values=new ContentValues();
        values.put("name","tangSeng");
        values.put("phone","110");
        values.put("amount","10");
        resolver.insert(uri, values);
    }
    
    public void testDelete() throws Exception{
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person/2");
        ContentResolver resolver=getContext().getContentResolver();
        resolver.delete(uri,null,null);
    }
    
    public void testUpdate() throws Exception{
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person/3");
        ContentResolver resolver=getContext().getContentResolver();
        ContentValues values=new ContentValues();
        values.put("name","shaSeng");
        values.put("phone","114");
        values.put("amount","14");
        resolver.update(uri, values,null,null);
    }
    
    public void testQuery() throws Exception{
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person");
        ContentResolver resolver=getContext().getContentResolver();
        Cursor cursor=resolver.query(uri,null,null,null,null);
        while(cursor.moveToNext()){
            String name=cursor.getString(cursor.getColumnIndex("name"));
            String phone=cursor.getString(cursor.getColumnIndex("phone"));
            Log.i("db",name+"-"+phone);
        }
        cursor.close();
    }
}
///////////////为新项目添加Content Provider数据变更通知
public class OtherAndroidActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //注册content provider数据变化监听器
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/persons");
        this.getContentResolver().registerContentObserver(uri,true,
                new PersonContentObserver(new Handler()));
    }
    
    public void insert(View v){
        Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person");
        ContentResolver resolver=getApplicationContext().getContentResolver();
        ContentValues values=new ContentValues();
        values.put("name","zhuBaJie");
        values.put("phone","113");
        values.put("amount","13");
        resolver.insert(uri, values);
        Toast.makeText(getApplicationContext(),"保存成功", 2);
    }
    
    //content provider 监听信息接收对象
    private class PersonContentObserver extends ContentObserver{

        public PersonContentObserver(Handler handler) {
            super(handler);
        }
        
        @Override
        public void onChange(boolean selfChange) {
            //super.onChange(selfChange);
            Uri uri=Uri.parse("content://cn.itcast.provider.personProvider/person");
            ContentResolver resolver=getApplicationContext().getContentResolver();
            Cursor cursor=resolver.query(uri, null, null,null,"id desc limit 1");
            if(cursor.moveToFirst()){
                String name=cursor.getString(cursor.getColumnIndex("name"));
                Toast.makeText(getApplicationContext(), "新增:"+name, 1);
            }
        }
    }
}


你可能感兴趣的:(Android-content-provider)