ContentProvider小結

一、什麼狀況下須要使用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);
            }
        });
相關文章
相關標籤/搜索