내 연락처 정보
우편메소피아@프로톤메일.com
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와 상호 작용합니다.
모든 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类进行解除