1. Concept et description
Définition de ContentProvider :
Le fournisseur de contenu est le module de base d'une application Android, fournissant du contenu à l'application. Fournissez-le à l'application via cette interface ContentResolver et utilisez ContentProvider pour partager des données entre différentes applications. Android fournit ContentProvider (vidéo, audio) pour certaines données communes. ContentProvider utilise la forme d'un tableau pour organiser les données.
Définition de l'URI :
Chaque ContentProvider a un URI public, qui est utilisé pour représenter les données fournies par ce ContentProvider. Les ContentProviders fournis par Android sont stockés dans android.provider.
2. Le processus de mise en œuvre de ContentProvider
1. Définissez les constantes requises pour ContentProvider (le plus important est de définir CONTENT_URI, CONTENT_URI est un type Uri, le fait est obtenu par analyse de chaîne)
//定义ContentProvider所需要的常量 public class FirstProviderMetaData { // AUTHORIY等于自己的创建ContentProvider类的完全路径 public static final String AUTHORIY = "com.example.firstconent.FirstContentProvider"; // 数据库的名称 public static final String DATABASE_NAME = "FirstProvider.db"; // BaseColumns有两个字段_id和_count public static final class UserTableMetaData implements BaseColumns { // 表名 public static final String TABLE_NAME = "t_user"; // 访问该ContentProvider的URI public static final Uri CONTENT_URI = Uri .parse("content://" + AUTHORIY); // 表的数据类型 public static final String CONTENT_TYPE = "vnd.android.cursor.dir/users"; // 一列的数据类型 public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/users"; // 一个字段 public static final String USER_NAME = "name"; // 默认排序 public static final String DEFAULT_SORT_ORDER = "_id desc"; } }
2. Définissez une classe qui hérite de ContentProvider
3. Implémentez les méthodes de requête, d'insertion, de mise à jour, de suppression, getType et onCreate
(1) Define UriMatcher
// 匹配Uri,检查Uri的合法性 public static final UriMatcher uriMatcher; public static final int INCOMING_USER_COLLECTION = 1; public static final int INCOMING_USER_SIGNLE = 2; static { // 创建一个uri树的根结点 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 添加uri匹配对,如果这个匹配成功,则code值则会返回。 uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user", INCOMING_USER_COLLECTION); uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/t_user/#", INCOMING_USER_SIGNLE); }
(2). Remplacez la méthode getType
// 根据传入uri,所回该uri所表示的数据类型 @Override public String getType(Uri uri) { // TODO Auto-generated method stub switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: return UserTableMetaData.CONTENT_TYPE; case INCOMING_USER_SIGNLE: return UserTableMetaData.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unknown URI" + uri); } }
(3) Créez un objet statique de carte de hachage userProjectMap
public static HashMap<String, String> userProjectMap; static { userProjectMap = new HashMap<String, String>(); userProjectMap.put(UserTableMetaData._ID, UserTableMetaData._ID); userProjectMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME); }
.
(4). Méthode d'insertion de réécriture
// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub SQLiteDatabase db = dbHelper.getWritableDatabase(); // rowId是新插入数据的id long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values); // 正常插入,-1为出常错误 if (rowId != -1) { // 添加一个id到这个路径的结尾 Uri insertUserUri = ContentUris.withAppendedId( UserTableMetaData.CONTENT_URI, rowId); // 得到一个ContentResolver实例. ContentResolver cr = this.getContext().getContentResolver(); // 通辞呈数据改变 cr.notifyChange(insertUserUri, null); return insertUserUri; } else { throw new SQLException("Failed to insert row into" + uri); } }
(5).
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); switch (uriMatcher.match(uri)) { case INCOMING_USER_COLLECTION: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); break; case INCOMING_USER_SIGNLE: sqb.setTables(UserTableMetaData.TABLE_NAME); sqb.setProjectionMap(userProjectMap); String idKey = UserTableMetaData._ID; // 1得到path集合 // 2取它的集合的第2个元素 // 例如:CONTENT_URI等于content://com.example.firstconent.FirstContentProvider/t_user/id, // content://为协议 // com.example.firstconent.FirstContentProvider为authoriy // /t_user/id为path String idValue = uri.getPathSegments().get(1); sqb.appendWhere(idKey + "=" + idValue); break; } String orderBy = null; if (TextUtils.isEmpty(sortOrder)) { orderBy = UserTableMetaData.DEFAULT_SORT_ORDER; } else { orderBy = sortOrder; } SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = sqb.query(db, projection, selection, selectionArgs, null, null, orderBy); ContentResolver cr = this.getContext().getContentResolver(); // 通适数据变动 cursor.setNotificationUri(cr, uri); return cursor; }
<provider android:name="com.example.firstcontent.FirstContentProvider" android:authorities="com.example.first.firstcontent.FirstContentProvider" > </provider>