私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
目次
ContentProvider 内のデータを一意に識別する
特定の拡張子のファイルを指定して特定のアプリケーションで開く
のように:
//外部进程向ContentProvider中添加数据 fun insert(uri:Uri,contentValues values):Uri //外部进程删除ContentProvider中数据 fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int //外部进程更新ContentProvider中数据 fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int //外部应用获取ContentProvider中数据 fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor
異なる ContentProvider のデータは URI を通じて操作可能
外部プロセスは、ContentResolver を通じて ContentProvider と対話します。
すべてのコンテンツプロバイダーの統合管理
ContentResolver
クラスが提供するContentProvider
クラス内に同じ名前と機能を持つ 4 つのメソッド
//外部进程向ContentProvider中添加数据 fun insert(uri:Uri,contentValues values):Uri //外部进程删除ContentProvider中数据 fun delete(uri:Uri,selection:String,selectionArgs:String[]):Int //外部进程更新ContentProvider中数据 fun update(uri:Uri,values:ContentValues,selection:String,selectionArgs:String[]):int //外部应用获取ContentProvider中数据 fun query (uri:Uri,projection:String[],selection:String,selectionArgs:String[],sortOrder:String):Cursor
val resolver = getContentResolver() val uri = Uri.parse("content://cn.scu.myprovider/user") val cursor:Cursor = resolver.query(uri,null,null,null,"userid desc")
URIにIDを追加して取得
// withAppendedId()作用:向URI追加一个id Uri uri = Uri.parse("content://cn.scu.myprovider/user") Uri resultUri = ContentUris.withAppendedId(uri, 7); // 最终生成后的Uri为:content://cn.scu.myprovider/user/7 // parseId()作用:从URL中获取ID Uri uri = Uri.parse("content://cn.scu.myprovider/user/7") long personid = ContentUris.parseId(uri); //获取的结果为:7
ContentProvider に URI を登録し、URI に従って登録コードを返し、ContentProvider 内の対応するデータ テーブルと照合します。
// 步骤1:初始化UriMatcher对象 UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); //常量UriMatcher.NO_MATCH = 不匹配任何路径的返回码 // 即初始化时不匹配任何东西 // 步骤2:在ContentProvider 中注册URI(addURI()) int URI_CODE_a = 1; int URI_CODE_b = 2; matcher.addURI("cn.scu.myprovider", "user1", URI_CODE_a); matcher.addURI("cn.scu.myprovider", "user2", URI_CODE_b); // 若URI资源路径 = content://cn.scu.myprovider/user1 ,则返回注册码URI_CODE_a // 若URI资源路径 = content://cn.scu.myprovider/user2 ,则返回注册码URI_CODE_b // 步骤3:根据URI 匹配 URI_CODE,从而匹配ContentProvider中相应的资源(match()) @Override public String getType(Uri uri) { Uri uri = Uri.parse(" content://cn.scu.myprovider/user1"); switch(matcher.match(uri)){ // 根据URI匹配的返回码是URI_CODE_a // 即matcher.match(uri) == URI_CODE_a case URI_CODE_a: return tableNameUser1; // 如果根据URI匹配的返回码是URI_CODE_a,则返回ContentProvider中的名为tableNameUser1的表 case URI_CODE_b: return tableNameUser2; // 如果根据URI匹配的返回码是URI_CODE_b,则返回ContentProvider中的名为tableNameUser2的表 } }
URI に起因する ContentProvider 内のデータ変更を監視し、訪問者に通知します
// 步骤1:注册内容观察者ContentObserver getContentResolver().registerContentObserver(uri); // 通过ContentResolver类进行注册,并指定需要观察的URI // 步骤2:当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者) public class UserContentProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { db.insert("user", "userid", values); getContext().getContentResolver().notifyChange(uri, null); // 通知访问者 } } // 步骤3:解除观察者 getContentResolver().unregisterContentObserver(uri); // 同样需要通过ContentResolver类进行解除