Android 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;
}
}
?
**為ContentProvider提供一個常量類MyContentProviderMetaData.java
package com.WangWeiDa.cp;
import android.net.Uri;
import android.provider.BaseColumns;
public class MyContentProviderMetaData {
//URI的指定,此處的字符串必須和聲明的authorities一致
public static final String AUTHORITIES = "com.wangweida.cp.MyContentProvider";
//數據庫名稱
public static final String DATABASE_NAME = "myContentProvider.db";
//數據庫的版本
public static final int DATABASE_VERSION = 1;
//表名
public static final String USERS_TABLE_NAME = "user";
public static final class UserTableMetaData implements BaseColumns{
//表名
public static final String TABLE_NAME = "user";
//訪問該ContentProvider的URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");
//該ContentProvider所返回的數據類型的定義
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.user";
public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.user";
//列名
public static final String USER_NAME = "name";
//默認的排序方法
public static final String DEFAULT_SORT_ORDER = "_id desc";
}
}
?
?
總結
以上是生活随笔為你收集整理的Android ContentProvider的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: loj 1316(spfa预处理+状压d
- 下一篇: [整理]MySql批量数据导入Load