一、什麼狀況下須要使用ContentProviderandroid
跨進程提供數據訪問的接口,若是在同一個App下,沒有必要使用此種方式ide
二、自定義ContentProviderthis
public class MyContentProvider extends ContentProvider { private MyDbHelper helper; //Sqlite幫助類 private SQLiteDatabase db; private static UriMatcher matcher; private static final String AUTHORITY="com.loo.person"; static { matcher=new UriMatcher(UriMatcher.NO_MATCH); matcher.addURI(AUTHORITY,"person",1); matcher.addURI(AUTHORITY,"person/#",2); } @Override public boolean onCreate() { helper=new MyDbHelper(getContext()); db=helper.getReadableDatabase(); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if( matcher.match(uri)==1){ return db.query("person",null,null,null,null,null,null); }else if(matcher.match(uri)==2){ long id= ContentUris.parseId(uri); return db.rawQuery("select * from person where id="+id,null); } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { if(matcher.match(uri)==1){ long flag= db.insert("person",null,values); if(flag>0){ getContext().getContentResolver().notifyChange(uri,null); return uri; } } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
AndroidManifest中註冊spa
<provider android:authorities="com.loo.person" //主機名 android:name=".MyContentProvider"></provider>
三、如何訪問?code
訪問須要一個Uri content://com.loo.person/person server
getContentResolver()便可調用一些相關的增刪改查的方法blog
四、當數據發生更改後如何響應?接口
當數據發生更改時,調用getContext().getContentResolver().notifyChange(uri,null);進程
並在獲取數據的地方get
getContentResolver().registerContentObserver(uri, false, new ContentObserver(handler) { @Override public void onChange(boolean selfChange) { List<Person> list= getData(); adapter=new MyAdapter(MainActivity.this,list); listview.setAdapter(adapter); } });