Android之ContentProvider共享數據

  • 什么是ContentProvider

    是所有應用程序之間數據存儲和檢索的橋梁

    作用:將應用程序的私有數據向外提供一個訪問的接口, 是基于URI的格式 ,向外提供數據訪問的接口

    ContentProvider 內容提供者 負責暴露數據 相當于服務器

    ContentResolver 內容解析者 負責解析ContentProvider暴露的數據 相當于客戶端

  • 自定義ContentProvider

    1.定義一個類繼承ContentProvider,重寫父類的六個方法

    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數據

    2.聲明ContentProvider的唯一標識(小寫字母,建議:包名+數據庫名)

    3.聲明訪問數據庫的Code碼(是在CotentProvider暴露數據時使用)

    4.定義Uri的匹配器UriMatcher,并且實例化(其他應用程序在通過ContentResolver執行CURD操作時,都需要一個重要的參數Uri,為了順利提供這個Uri參數,Android系統提供了一個UriMatcher工具類)

    private static UriMatcher uriMatcher ;
    static
    {
        uriMatcher  = new UriMatcher(UriMatcher.NO_MATCH);
         uriMatcher.add("唯一標識","路徑(建議: 表名)",當前Uri對應的數據庫的code碼);
    }

    5.定義一個數據庫的幫助類(SQLiteOpenHelper),并在onCreate() 方法中完成數據表的初始

    6.在相應的增 刪 改 查 方法中, 通過Uri匹配器, 判斷當前用戶傳入的Uri到底是操作那張表的code

    7.在清單文件中注冊ContentProvider

    <provider    
        android:name=""   說明注冊的是哪個CotentProvider   (全類名)
        android:authorities=""   與CotentProvider中的 唯一標識完全一致
        android:exported=""    聲明當前應用程序  可以被外部的應用程序訪問
      />
  • 注意:

    ContentProvider是單例模式的,當多個應用程序通過使用ContentResolver來操作使用ContentProvider提供的數據時,ContentResolver調用的數據操作會委托給同一個ContentProvider來處理,這樣就能保證數據的一致性。

  • 實例:

    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>

     

    來自:http://www.jianshu.com/p/0fb3c989dab6

     

 本文由用戶 yeoj3133 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!