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); } } } }