Android 面试题之ContentProvider使用+实例
- 一般來說ContentProvider是單例模式,多個應用可通過ContentResolver調用ContentProvider的增刪改查操作數據,ContentResolver調用的數據操作會讓同一個ContentProvider處理。
四、創建ContentProvider
1、創建一個類讓其繼承ContentProvider,并重載6個函數
需要實現的主要方法是:
-
「insert()」、「delete()」、「update()」、「query()」:用于對數據集的增刪改查操作。
-
「onCreate()」:一般用來初始化底層數據集和建立數據連接等工作
-
「getType()」:用來返回指定Uri的MIME數據類型,
-
若Uri是單條數據,則返回的MIME數據類型以vnd.Android.cursor.item開頭;
-
若Uri是多條數據,則返回的MIME數據類型以vnd.android.cursor.dir/開頭。
數據訪問方法**「如insert(Uri,ContentValues)和update(Uri,ContentValues,Bundle)」** 可以同時從多個線程調用,并且必須是線程安全的。其他方法**「如onCreate()」** 僅從應用程序主線程調用,并且必須避免執行冗長的操作。請參閱其預期線程行為的方法描述。
2、聲明Uri規則,實現UriMatcher
咱先來看看UriMatcher是干嘛的,UriMatcher本質上是一個文本過濾器,有助于解析Uri,用在ContentProvider中幫助我們過濾,分辨出查詢者想要查詢哪個數據表。
UriMatcher的構造函數中,UriMatcher.NO_MATCH是Uri無匹配時的返回代碼,值為-1。addUri()方法用來添加新的匹配項,語法為:
public?void?addUri(String?authority,?String?path,?int?code)
-
authority表示匹配的授權者名稱;
-
path表示數據路徑;
-
code表示返回代碼。
下面咱搞個實例:
//這里的名稱必須與AndroidManifest.xml中android:authorities保持一致
public?static?final?String?AUTHORITY?=?“com.scc.userprovider”;
//數據路徑
public?static?final?String?PATH_USERS?=?“user”;
//訪問ContentProvider的URL
public?static?final?Uri?CONTENT_URI?=?Uri.parse(“content://”?+?AUTHORITY?+?“/”?+?PATH_USERS);
//返回代碼
public?static?final?int?USER_INFO?=?1;
//創建UriMatcher對象
private?static?UriMatcher?uriMatcher;
//創建靜態代碼塊
static?{
//實例化UriMatcher對象
uriMatcher?=?new?UriMatcher(UriMatcher.NO_MATCH);
//參數1:authority;參數2:路徑;參數3:自定義代碼
uriMatcher.addURI(UserInfoContent.AUTHORITY,?UserInfoContent.PATH_USERS,?USER_INFO);
}
3、注冊ContentProvider
在AndroidManifest.xml文件中的 application節點下使用標簽注冊。樣例:
<android:authorities=“com.scc.userprovider”
android:name=“.UserProvider”
android:exported=“true”/>
五、使用ContentProvider
1、通過insert()方法添加單條數據
ContentValues?cv?=?new?ContentValues();
cv.put(UserInfoContent._ID,?bean.get_id());
cv.put(UserInfoContent.USER_NAME,?bean.getName());
cv.put(UserInfoContent.USER_AGE,?bean.getAge());
cv.put(UserInfoContent.USER_UPDATE_TIME,?bean.getUpdate_time());
Uri?uri?=?getContentResolver().insert(UserInfoContent.CONTENT_URI,?cv);
Log.e(getClass().getName(),?“insert:”?+?uri);
- 通過bulkInsert()方法添加多條數據
ContentValues[]?arrayValues?=?new?ContentValues[10];
//實例化每一個ContentValues…
int?count?=?getContentResolver().bulkInsert(UserInfoContent.CONTENT_URI,?arrayValues);
2、指定ID刪除單條數據
int?delete?=?getContentResolver().delete(UserInfoContent.CONTENT_URI,?“_id=12”,?null);
Log.e(getClass().getName(),?“delete(失敗返回-1):”?+?delete);
- 通過selection語句刪除多條數據
String?selection?=?UserInfoContent._ID?+?“>12”;
int?result?=?getContentResolver().delete(UserInfoContent.CONTENT_URI,?selection,?null);
3、修改數據
UserInfoBean?bean?=?new?UserInfoBean(“蚩尤”,?32,?“12:00”);
ContentValues?cv?=?new?ContentValues();
cv.put(UserInfoContent.USER_NAME,?bean.getName());
cv.put(UserInfoContent.USER_AGE,?bean.getAge());
cv.put(UserInfoContent.USER_UPDATE_TIME,?bean.getUpdate_time());
getContentResolver().update(UserInfoContent.CONTENT_URI,?cv,?“_id=18”,?null);
4、查詢數據
Cursor?cursor?=?getContentResolver().query(UserInfoContent.CONTENT_URI,?null,?selection,?null,?null);
//循環取出游標指向的每條用戶記錄
while?(cursor.moveToNext())?{
UserInfoBean?user?=?new?UserInfoBean();
user.name?=?cursor.getString(cursor.getColumnIndex(UserInfoContent.USER_NAME));
user.age?=?cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_AGE));
總結
以上是生活随笔為你收集整理的Android 面试题之ContentProvider使用+实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Service Mesh 最火项目 Is
- 下一篇: recovery: ASCII cpio