ContentProvider与ContentResolver使用
生活随笔
收集整理的這篇文章主要介紹了
ContentProvider与ContentResolver使用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
例如以下內容為從網絡轉載: 使用ContentProvider共享數據: 當應用繼承ContentProvider類,并重寫該類用于提供數據和存儲數據的方法,就能夠向其它應用共享其數據。雖然使用其它方法也能夠對外共享數據,但數據訪問方式會因數據存儲的方式而不同,如:採用文件方式對外共享數據,須要進行文件操作讀寫數據;採用sharedpreferences共享數據,須要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的優(yōu)點是統(tǒng)一了數據訪問方式。 當應用須要通過ContentProvider對外共享數據時,第一步須要繼承ContentProvider并重寫以下方法: public class PersonContentProvider extends ContentProvider{ ?? public boolean onCreate() ?? public Uri insert(Uri uri, ContentValues values) ?? public int delete(Uri uri, String selection, String[] selectionArgs) ?? public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) ?? public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) ?? public String getType(Uri uri)} 第二步須要在AndroidManifest.xml使用<provider>對該ContentProvider進行配置,為了能讓其它應用找到該ContentProvider , ContentProvider 採用了authorities(主機名/域名)對它進行唯一標識,你能夠把 ContentProvider看作是一個站點(想想,站點也是提供數據者),authorities 就是他的域名: <manifest .... > ??? <application android:icon="@drawable/icon" android:label="@string/app_name"> ??????? <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.provider.personprovider"/> ??? </application> </manifest> 注意:一旦應用繼承了ContentProvider類,后面我們就會把這個應用稱為ContentProvider(內容提供者)。 l?
?
Uri介紹: Uri代表了要操作的數據,Uri主要包括了兩部分信息:1》須要操作的ContentProvider ,2》對ContentProvider中的什么數據進行操作,一個Uri由下面幾部分組成: l ContentProvider(內容提供者)的scheme已經由Android所規(guī)定, scheme為:content:// 主機名(或叫Authority)用于唯一標識這個ContentProvider,外部調用者能夠依據這個標識來找到它。 路徑(path)能夠用來表示我們要操作的數據,路徑的構建應依據業(yè)務而定,例如以下: 要操作person表中id為10的記錄,能夠構建這種路徑:/person/10 要操作person表中id為10的記錄的name字段,person/10/name 要操作person表中的全部記錄,能夠構建這種路徑:/person 要操作xxx表中的記錄,能夠構建這種路徑:/xxx 當然要操作的數據不一定來自數據庫,也能夠是文件等他存儲方式,例如以下: 要操作xml文件里person節(jié)點下的name節(jié)點,能夠構建這種路徑:/person/name 假設要把一個字符串轉換成Uri,能夠使用Uri類中的parse()方法,例如以下: Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")lUriMatcher類使用介紹: 由于Uri代表了要操作的數據,所以我們非常常常須要解析Uri,并從Uri中獲取數據。Android系統(tǒng)提供了兩個用于操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便于我們的開發(fā)工作。 UriMatcher類用于匹配Uri,它的使用方法例如以下: 首先第一步把你須要匹配Uri路徑所有給注冊上,例如以下: //常量UriMatcher.NO_MATCH表示不匹配不論什么路徑的返回碼 UriMatcher? sMatcher = new UriMatcher(UriMatcher.NO_MATCH); //假設match()方法匹配content://cn.itcast.provider.personprovider/person路徑,返回匹配碼為1 sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//加入須要匹配uri,假設匹配就會返回匹配碼 //假設match()方法匹配content://cn.itcast.provider.personprovider/person/230路徑,返回匹配碼為2 sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#號為通配符 switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) { ?? case 1 ??? break; ?? case 2 ??? break; ?? default://不匹配 break; } 注冊完須要匹配的Uri后,就能夠使用sMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,如果匹配content://cn.itcast.provider.personprovider/person路徑,返回的匹配碼為1 lContentUris類使用介紹: ContentUris類用于獲取Uri路徑后面的ID部分,它有兩個比較有用的方法: withAppendedId(uri, id)用于為路徑加上ID部分: Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person") Uri resultUri = ContentUris.withAppendedId(uri, 10); //生成后的Uri為:content://cn.itcast.provider.personprovider/person/10 parseId(uri)方法用于從路徑中獲取ID部分: Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person/10") long personid = ContentUris.parseId(uri);//獲取的結果為:10 l使用ContentProvider共享數據: ContentProvider類主要方法的作用: public boolean onCreate() 該方法在ContentProvider創(chuàng)建后就會被調用, Android在系統(tǒng)啟動時就會創(chuàng)建ContentProvider 。 public Uri insert(Uri uri, ContentValues values) 該方法用于供外部應用往ContentProvider加入數據。 public int delete(Uri uri, String selection, String[] selectionArgs) 該方法用于供外部應用從ContentProvider刪除數據。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 該方法用于供外部應用更新ContentProvider中的數據。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 該方法用于供外部應用從ContentProvider中獲取數據。 public String getType(Uri uri) 該方法用于返回當前Url所代表數據的MIME類型。假設操作的數據屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭,比如:要得到全部person記錄的Uri為content://cn.itcast.provider.personprovider/person,那么返回的MIME類型字符串應該為:“vnd.android.cursor.dir/person”。假設要操作的數據屬于單一數據,那么MIME類型字符串應該以vnd.android.cursor.item/開頭,比如:得到id為10的person記錄,Uri為content://cn.itcast.provider.personprovider/person/10,那么返回的MIME類型字符串應該為:“vnd.android.cursor.item/person”。 l使用ContentResolver操作ContentProvider中的數據: 當外部應用須要對ContentProvider中的數據進行加入、刪除、改動和查詢操作時,能夠使用ContentResolver 類來完畢,要獲取ContentResolver 對象,能夠使用Activity提供的getContentResolver()方法。 ContentResolver 類提供了與ContentProvider類同樣簽名的四個方法: public Uri insert(Uri uri, ContentValues values) 該方法用于往ContentProvider加入數據。 public int delete(Uri uri, String selection, String[] selectionArgs) 該方法用于從ContentProvider刪除數據。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 該方法用于更新ContentProvider中的數據。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 該方法用于從ContentProvider中獲取數據。 這些方法的第一個參數為Uri,代表要操作的是哪個ContentProvider和對當中的什么數據進行操作,如果給定的是: Uri.parse(“content://cn.itcast.provider.personprovider/person/10”),那么將會對主機名為cn.itcast.provider.personprovider的ContentProvider進行操作,操作的數據為person表中id為10的記錄
l使用ContentResolver操作ContentProvider中的數據: 使用ContentResolver對ContentProvider中的數據進行加入、刪除、改動和查詢操作: ContentResolver resolver =? getContentResolver(); Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person"); //加入一條記錄 ContentValues values = new ContentValues(); values.put("name", "itcast"); values.put("age", 25); resolver.insert(uri, values); //獲取person表中全部記錄 Cursor cursor = resolver.query(uri, null, null, null, "personid desc"); while(cursor.moveToNext()){ Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1)); } //把id為1的記錄的name字段值更改新為liming ContentValues updateValues = new ContentValues(); updateValues.put("name", "liming"); Uri updateIdUri = ContentUris.withAppendedId(uri, 2); resolver.update(updateIdUri, updateValues, null, null); //刪除id為2的記錄 Uri deleteIdUri = ContentUris.withAppendedId(uri, 2); resolver.delete(deleteIdUri, null, null); public class PersonContentProvider extends ContentProvider{ private DataBaseOpenHelper dataBaseOpenHelper; private static final int ALLPERSON=1; private static final int PERSON=2; private static final UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); static{ uriMatcher.addURI("com.gao.provider.personprovider", "person", ALLPERSON); uriMatcher.addURI("com.gao.provider.personprovider", "person/#", PERSON); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); int count=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person count=database.delete("person", selection, selectionArgs); break; case PERSON://content://com.gao.provider.personprovider/person/100 long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } count=database.delete("person", where, selectionArgs); break; default: throw new IllegalArgumentException("Unkonw uri:"+uri); } return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case ALLPERSON: return "vnd.android.cursor.dir/personprovider.person"; case PERSON: return "vnd.android.cursor.item/personprovider.person"; default: break; } return null; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); long id=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person id=database.insert("person", "name", values);//返回記錄的行號,主鍵是int,實際上就是主鍵值 return ContentUris.withAppendedId(uri, id); case PERSON://content://com.gao.provider.personprovider/person/100 id=database.insert("person", "name", values); String path=uri.toString(); return Uri.parse(path.substring(0, path.lastIndexOf("/"))+"id"); default: throw new IllegalArgumentException("Unkonw uri:"+uri); } } @Override public boolean onCreate() { dataBaseOpenHelper=new DataBaseOpenHelper(this.getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase database=dataBaseOpenHelper.getReadableDatabase(); switch (uriMatcher.match(uri)) { case ALLPERSON: database.query("person", projection, selection, selectionArgs, null, null, sortOrder); break; case PERSON: long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } database.query("person", projection, where, params, null, null, sortOrder); break; default: break; } return null; } //update("content://com.gao.provider.personprovider/person/100",values,"name like ? and ...",new String[]{"%gao%"}); @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase database=dataBaseOpenHelper.getWritableDatabase(); int count=0; switch (uriMatcher.match(uri)) { case ALLPERSON://content://com.gao.provider.personprovider/person count=database.update("person", values, selection,selectionArgs); break; case PERSON://content://com.gao.provider.personprovider/person/100 long id=ContentUris.parseId(uri); String where=TextUtils.isEmpty(selection)?"personid=?":selection+"and personid=?"; String[] params=new String[]{String.valueOf(id)}; if (!TextUtils.isEmpty(selection)&&selectionArgs!=null) { params=new String[selectionArgs.length+1]; for (int i = 0; i < selectionArgs.length; i++) { params[i]=selectionArgs[i]; } params[selectionArgs.length+1]=String.valueOf(id); } count=database.update("person", values, where,params); break; default: throw new IllegalArgumentException("Unkonw uri:"+uri); } return count; } } ? AndroidManifest.xml: <provider android:name="PersonContentProvider" android:authorities="com.gao.provider.personprovider" /> 在還有一個程序ContentProviderUser中使用上面的內容提供者: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver contentResolver=this.getContentResolver(); Uri allUri=Uri.parse("content://com.gao.provider.personprovider/person"); ContentValues values=new ContentValues(); values.put("name", "GGGGG"); values.put("age", 19); contentResolver.insert(uri, values); values.put("name", "CCCCCC"); values.put("age", 100); Uri uri=Uri.parse("content://com.gao.provider.personprovider/person/9"); // contentResolver.update(uri, values, null, null); //contentResolver.delete(uri, null, null); Cursor cursor=contentResolver.query(uri, new String[]{"personid","name","age"}, null, null, "personid desc"); while (cursor.moveToNext()) { Log.i(TAG, "psrsonid:"+cursor.getInt(0)+",name:"+cursor.getString(1)+",age"+cursor.getInt(2)); } cursor.close(); }?
?
轉載于:https://www.cnblogs.com/blfshiye/p/4076025.html
總結
以上是生活随笔為你收集整理的ContentProvider与ContentResolver使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GCD6: 在GCD上异步执行非UI相关
- 下一篇: hdu--4028--dp