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