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