Android之ContentProvider共享数据

yeoj3133 8年前
   <ul>     <li> <p><strong>什么是ContentProvider</strong></p> <p>是所有应用程序之间数据存储和检索的桥梁</p> <p>作用:将应用程序的私有数据向外提供一个访问的接口, 是基于URI的格式 ,向外提供数据访问的接口</p> <p>ContentProvider 内容提供者 负责暴露数据 相当于服务器</p> <p>ContentResolver 内容解析者 负责解析ContentProvider暴露的数据 相当于客户端</p> </li>     <li> <p><strong>自定义ContentProvider</strong></p> <p>1.定义一个类继承ContentProvider,重写父类的六个方法</p> <pre>  <code class="language-java">boolean onCreate() //初始化Provider  Uri insert(Uri uri,ContentValues values)//插入新数据  int delete(Uri uri, String selection, String[] selectionArgs)//删除数据  int update(Uri uri,ContentValues values, String selection, String[] selectionArgs)//更新已存在数据  Cursor query(Uri uri,String[] projection, String selection, String[] selectionArgs,String sortOrder) //返回数据给调用者  String getType(Uri uri) //返回ContentProvider的mime数据</code></pre> <p>2.声明ContentProvider的唯一标识(小写字母,建议:包名+数据库名)</p> <p>3.声明访问数据库的Code码(是在CotentProvider暴露数据时使用)</p> <p>4.定义Uri的匹配器UriMatcher,并且实例化(其他应用程序在通过ContentResolver执行CURD操作时,都需要一个重要的参数Uri,为了顺利提供这个Uri参数,Android系统提供了一个UriMatcher工具类)</p> <pre>  <code class="language-java">private static UriMatcher uriMatcher ;  static  {      uriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);       uriMatcher.add("唯一标识","路径(建议: 表名)",当前Uri对应的数据库的code码);  }</code></pre> <p>5.定义一个数据库的帮助类(SQLiteOpenHelper),并在onCreate() 方法中完成数据表的初始</p> <p>6.在相应的增 删 改 查 方法中, 通过Uri匹配器, 判断当前用户传入的Uri到底是操作那张表的code</p> <p>7.在清单文件中注册ContentProvider</p> <pre>  <code class="language-java"><provider          android:name=""   说明注册的是哪个CotentProvider   (全类名)      android:authorities=""   与CotentProvider中的 唯一标识完全一致      android:exported=""    声明当前应用程序  可以被外部的应用程序访问    /></code></pre> </li>     <li> <p><strong>注意:</strong></p> <p>ContentProvider是单例模式的,当多个应用程序通过使用ContentResolver来操作使用ContentProvider提供的数据时,ContentResolver调用的数据操作会委托给同一个ContentProvider来处理,这样就能保证数据的一致性。</p> </li>     <li> <p><strong>实例:</strong></p> <pre>  <code class="language-java">public class UserContentProvider extends ContentProvider {  private DbOpenHelper dbOpenHelper;  //2, 声明ContentProvider组件的唯一表示, 必须是小写的字母  //建议:  应用程序的包名+标识资源的名称 (数据库的名称)  private static final String AUTHORITY = "com.qf.day16_contentprovider_04.qf";  //3, 声明访问数据库中的那些表的code  private static final int CODE_USER = 0;  private static final int CODE_ORDER = 5;  //4, 声明Uri的匹配器, 实例化  private static UriMatcher uriMatcher;  static{    //匹配码   UriMatcher.NO_MATCH : 不匹配任何的Uri    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);      //注册的Uri    /**     * authority    CotentProvider 的唯一表示     * path            路径(建议为表名,但是不一定)     * code            当前url的匹配码     */    //content://com.qf.day16_contentprovider_04.qf/t_user    uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);//URI      //content://com.qf.day16_contentprovider_04.qf/t_order    uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER);      }  @Override  public boolean onCreate() {    // 初始化的工作    //getContext() 得到上下文对象    dbOpenHelper = new DbOpenHelper(getContext());    return false;  }    @Override  public Cursor query(Uri uri, String[] projection, String selection,        String[] selectionArgs, String sortOrder) {    // 查询数据    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();      Cursor curson = null;    //通过Uri的匹配器, 判断当前的Uri访问的是那张表    switch (uriMatcher.match(uri)) {    case CODE_USER:          curson = db.query("t_user", projection, selection, selectionArgs, null, null, sortOrder);          break;      case CODE_ORDER:          curson = db.query("t_order", projection, selection, selectionArgs, null, null, sortOrder);          break;    }      return curson;  }  @Override  public Uri insert(Uri uri, ContentValues values) {    // 插入数据      SQLiteDatabase db = dbOpenHelper.getWritableDatabase();      long id = 0 ;    if(uriMatcher.match(uri)==CODE_USER)    {        //向数据库中插入数据后, 返回当前插入数据的id        id = db.insert("t_user", null, values);          //生成最新的URI  并返回(旧的Uri + id)        //content://com.qf.day16_contentprovider_04.qf/t_user/7        return ContentUris.withAppendedId(uri, id);      }    if(uriMatcher.match(uri) == CODE_ORDER)    {        id = db.insert("t_order", null, values);          return ContentUris.withAppendedId(uri, id);    }      return null;  }    @Override  public int delete(Uri uri, String selection, String[] selectionArgs) {    // 删除数据      SQLiteDatabase db = dbOpenHelper.getWritableDatabase();      int count = 0;      if(uriMatcher.match(uri) == CODE_USER)    {        count = db.delete("t_user", selection, selectionArgs);    }      return count;  }    @Override  public int update(Uri uri, ContentValues values, String selection,        String[] selectionArgs) {    // 修改数据      SQLiteDatabase db = dbOpenHelper.getWritableDatabase();      int count = 0;    if(uriMatcher.match(uri) == CODE_USER)    {        count = db.update("t_user", values, selection, selectionArgs);    }      return count;  }    @Override  public String getType(Uri uri) {    // TODO 只实现, 不处理    return null;  }  }</code></pre> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/0fb3c989dab6</p>    <p> </p>