1、什么情况下需要使用ContentProvider

  跨进程提供数据访问的接口,如果在同一个App下,没有必要使用此种方式

2、自定义ContentProvider

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中注册

   <provider
            android:authorities="com.loo.person" //主机名
            android:name=".MyContentProvider"></provider>

3、如何访问?

  访问需要一个Uri content://com.loo.person/person 

  getContentResolver()即可调用一些相关的增删改查的方法

4、当数据发生更改后如何响应?

  当数据发生更改时,调用getContext().getContentResolver().notifyChange(uri,null);

  并在获取数据的地方

   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);
            }
        });
posted on 2016-11-09 14:28  向着大牛奋斗  阅读(479)  评论(0编辑  收藏  举报