淺談ContentProvider的跨應(yīng)用數(shù)據(jù)共享

因?yàn)闃I(yè)務(wù)需求,小研究了下跨應(yīng)用間的數(shù)據(jù)共享,找到了ContentProvider(內(nèi)容提供者)和AIDL兩種方式,接下來幾期會(huì)介紹給大家:
ContentProvider:
我們有很多種方式去獲取應(yīng)用內(nèi)部的單一數(shù)據(jù)共享,但如果我們要獲取來自android系統(tǒng)內(nèi)部的比如聯(lián)系人或者短信等其它信息,亦或者想要獲取公司旗下其它app的一些信息該如何處理,android提供了ContentProvider來滿足我們的需求。
ContentProvider向我們提供了我在應(yīng)用程序之間共享數(shù)據(jù)的一種機(jī)制,接下來我會(huì)用demo的形式進(jìn)行介紹。
1.創(chuàng)建兩個(gè)demo,cpdemo1,cpdemo2。
2.通過cpdemo2獲取cpdemo1中數(shù)據(jù)庫(kù)里的數(shù)據(jù)。
cpdemo1:
定義一個(gè)const類:

public static final String DATABASE_NAME = "user.db";
public static int DATABANSE_VERSION = 1;
public static final String TABLE_NAME = "user";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";

定義table的一些名稱和字段

public static final String AUTOHORITY = "com.demo.contentprovider.BBContentProvider";

AUTOHORITY:包命+類名的形式命名,provider在mainfest中注冊(cè)時(shí)候會(huì)用到,也是其他程序訪問該程序的必須的驗(yàn)證條件。(下面是xml文件中的注冊(cè))

<provider    
android:exported = "true"        
android:name="com.demo.contentprovider.BBContentProvider"
android:authorities="com.demo.contentprovider.BBContentProvider"/>

ContentProvider的使用中會(huì)涉及到URI的內(nèi)容,我們可以把URI看做要操作的數(shù)據(jù),可以根據(jù)解析其來獲取對(duì)應(yīng)的數(shù)據(jù)。

public static final Uri CONTENT_URI = Uri.parse("content://com.demo.contentprovider.BBContentProvider/user");

這個(gè)uri可以看成網(wǎng)頁(yè)鏈接,"content://"和http一樣的標(biāo)準(zhǔn)前綴,"com.demo.contentprovider.BBContentProvider"看成域名,"/user"看成要訪問的table。

再寫個(gè)DBHelper輔助類,便于處理數(shù)據(jù)庫(kù)操作。

public class DBHelper extends SQLiteOpenHelper {    
  public DBHelper(Context context) {        
      super(context, Const.DATABASE_NAME, null,Const.DATABANSE_VERSION);    
  }    
  @Override    
  public void onCreate(SQLiteDatabase db) {        
      db.execSQL("CREATE TABLE IF NOT EXISTS " + Const.TABLE_NAME + "("+ Const.COLUMN_ID +" INTEGER PRIMARY KEY AUTOINCREMENT," + Const.COLUMN_NAME +" VARCHAR NOT NULL);");    
  }    
  @Override    
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int   newVersion) {            
  }
}

BBContentProvider類,繼承于ContentProvider,實(shí)現(xiàn)類似數(shù)據(jù)庫(kù)的增刪改查功能,還有個(gè)返回類型的getType用于區(qū)分驗(yàn)證標(biāo)識(shí)。

public class BBContentProvider2 extends ContentProvider{    
  private DBHelper mDBHelper;    
  @Override    
  public boolean onCreate() {        
    mDBHelper = new DBHelper(this.getContext());        
    return true;    
  }    
    @Nullable    
    @Override    
   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {                
    return null;    
  }    
    @Nullable    
    @Override   
   public String getType(Uri uri) {        
    return null;    
  }    
  @Nullable    
  @Override    
  public Uri insert(Uri uri, ContentValues values) { 
    //創(chuàng)建數(shù)據(jù)庫(kù)       
    SQLiteDatabase db = mDBHelper.getWritableDatabase(); 
    //數(shù)據(jù)庫(kù)插入方式
    db.insert(Const.TABLE_NAME,null,values);        
   return uri;    
}    
  @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;    
  }
}

這樣cpdemo1就完成了,接下來寫cpdemo2,
cpdemo2代碼很簡(jiǎn)單,其他代碼沿用demo1的,只是在main中執(zhí)行添加代碼:

Uri baseUri = Uri.parse("content://com.demo.contentprovider.BBContentProvider/user");

private void insert(){   
  //使用ContentResolver對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行添加、刪除、修改和查詢操作:
  ContentResolver cr = this.getContentResolver();    
  ContentValues cv = new ContentValues();    
  cv.put("name","abc");    
  cr.insert(baseUri,cv);
}

執(zhí)行對(duì)應(yīng)的操作后,就可在cpdemo1的數(shù)據(jù)庫(kù)目錄下發(fā)現(xiàn)新增的數(shù)據(jù),也就實(shí)現(xiàn)了不同應(yīng)用間簡(jiǎn)易的數(shù)據(jù)共享和操作。


_本站文章為 寶寶巴士 SD.Team 原創(chuàng),轉(zhuǎn)載務(wù)必在明顯處注明:(作者官方網(wǎng)站: 寶寶巴士 ) _
_轉(zhuǎn)載自【寶寶巴士SuperDo團(tuán)隊(duì)】原文鏈接: http://www.lxweimin.com/p/4195137834ea

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容