contentProvider的用法
一、ContentProvider的概念
ContentProvider:為儲存和獲取資料提供統一的介面。可以在不同的應用程式之間共享資料。Android已經為常見的一些資料提供了預設的ContentProvider
1、ContentProvider使用表的形式來組織資料
無論資料的來源是什麼,ContentProvider都會認為是一種表,然後把資料組織成表格
2、ContentProvider提供的方法
query:查詢
insert:插入
update:更新
delete:刪除
getType:得到資料型別
onCreate:建立資料時呼叫的回撥函式
3、每個ContentProvider都有一個公共的URI,這個URI用於表示這個ContentProvider所提供的資料。Android所提供的ContentProvider都存放在android.provider包當中
二、ContentProvider的內部原理
自定義一個ContentProvider,來實現內部原理
步驟:
1、定義一個CONTENT_URI常量(裡面的字串必須是唯一)
Public static final Uri CONTENT_URI = Uri.parse("content://com.WangWeiDa.MyContentprovider");
如果有子表,URI為:
Public static final Uri CONTENT_URI = Uri.parse("content://com.WangWeiDa.MyContentProvider/users");
2、定義一個類,繼承ContentProvider
Public class MyContentProvider extends ContentProvider
3、實現ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
package com.WangWeiDa.cp;
import java.util.HashMap;
import com.WangWeiDa.cp.MyContentProviderMetaData.UserTableMetaData;
import com.WangWeiDa.data.DatabaseHelp;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class MyContentProvider extends ContentProvider {
//訪問表的所有列
public static final int INCOMING_USER_COLLECTION = 1;
//訪問單獨的列
public static final int INCOMING_USER_SINGLE = 2;
//操作URI的類
public static final UriMatcher uriMatcher;
//為UriMatcher新增自定義的URI
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user",
INCOMING_USER_COLLECTION);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user/#",
INCOMING_USER_SINGLE);
}
private DatabaseHelp dh;
//為資料庫表欄位起別名
public static HashMap userProjectionMap;
static
{
userProjectionMap = new HashMap();
userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
}
/
刪除表資料
/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
System.out.println("delete");
//得到一個可寫的資料庫
SQLiteDatabase db = dh.getWritableDatabase();
//執行刪除,得到刪除的行數
int count = db.delete(UserTableMetaData.TABLE_NAME, selection, selectionArgs);
return count;
}
/
資料庫訪問型別
/
@Override
public String getType(Uri uri) {
System.out.println("getType");
//根據使用者請求,得到資料型別
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("UnKnown URI"+uri);
}
}
/
插入資料
/
@Override
public Uri insert(Uri uri, ContentValues values) {
//得到一個可寫的資料庫
SQLiteDatabase db = dh.getWritableDatabase();
//向指定的表插入資料,得到返回的Id
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
if(rowId > 0){//判斷插入是否執行成功
//如果新增成功,利用新新增的Id和
Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
//通知監聽器,資料已經改變
getContext().getContentResolver().notifyChange(insertedUserUri, null);
return insertedUserUri;
}
return uri;
}
/
建立ContentProvider時呼叫的回撥函式
/
@Override
public boolean onCreate() {
System.out.println("onCreate");
//得到資料庫幫助類
dh = new DatabaseHelp(getContext(),MyContentProviderMetaData.DATABASE_NAME);
return false;
}
/
查詢資料庫
/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//建立一個執行查詢的Sqlite
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
//判斷使用者請求,查詢所有還是單個
switch(uriMatcher.match(uri)){
case INCOMING_USER_COLLECTION:
//設定要查詢的表名
qb.setTables(UserTableMetaData.TABLE_NAME);
//設定表欄位的別名
qb.setProjectionMap(userProjectionMap);
break;
case INCOMING_USER_SINGLE:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
//追加條件,getPathSegments()得到使用者請求的Uri地址擷取的陣列,get(1)得到去掉地址中/以後的第二個元素
qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
break;
}
//設定排序
String orderBy;
if(TextUtils.isEmpty(sortOrder)){
orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
}
else{
orderBy = sortOrder;
}
//得到一個可讀的資料庫
SQLiteDatabase db = dh.getReadableDatabase();
//執行查詢,把輸入傳入
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
//設定監聽
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
/
更新資料庫
/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
System.out.println("update");
//得到一個可寫的資料庫
SQLiteDatabase db = dh.getWritableDatabase();
//執行更新語句,得到更新的條數
int count = db.update(UserTableMetaData.TABLE_NAME, values, selection, selectionArgs);
return count;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2480/viewspace-2798770/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ContentProviderIDE
- ContentProvider的基本使用IDE
- Android ContentProvider 啟動分析AndroidIDE
- 從原始碼角度看ContentProvider原始碼IDE
- Android系統原始碼分析之-ContentProviderAndroid原始碼IDE
- Android 四大元件之 ContentProviderAndroid元件IDE
- Android四大元件之ContentProviderAndroid元件IDE
- Android四大元件之ContentProvider篇Android元件IDE
- Android必知必會的四大元件 -- ContentProvider篇Android元件IDE
- Android點將臺:濟世儒俠[-ContentProvider-]AndroidIDE
- Android ContentProvider 基本原理和使用詳解AndroidIDE
- Android使用ContentProvider初始化SDK庫方案總結AndroidIDE
- 從ContentProvider報SecurityException分析出Android5.0+的一個隱藏大坑IDEExceptionAndroid
- 開源庫小技巧+1,在 ContentProvider 中初始化IDE
- Qdrant用法;Qdrant在langchain裡的用法LangChain
- indexOf()的用法Index
- Pythonyield的用法Python
- Promise的用法Promise
- errno的用法
- SQL AS 的用法SQL
- confirm的用法
- SUBMIT 的用法MIT
- tie的用法
- volatile的用法
- using的用法
- openssl的用法
- RDD用法與例項(五):glom的用法
- SqlServer的with(nolock)的用法SQLServer
- oracle comment on的用法Oracle
- React Hooks 的用法ReactHook
- Node assert 的用法
- MongoDB的基本用法MongoDB
- Vue slot的用法Vue
- React ref的用法React
- js中的this用法JS
- async的基本用法
- dva的基本用法
- rematch的基本用法REM