Android中Content Provider
在Android技術持久化技術中,包含著檔案儲存,SharedPreferences儲存以及SQLite,在這些持久化技術中儲存到資料都只能在當前應用程式中訪問,那麼如何將資料共享給其他程式呢?那就要說到
Content Provider(內容提供器)
在內容提供器中,有別於檔案儲存這類的是,他可以指定想要共享的部分,而不是全域性共享
對於每一個應用程式來說,如果想要訪問內容提供器 裡共享的資料,就一定要藉助ContentResolver類,透過getContent -Resolver獲取例項,在 ContentResolver中提供了一系CRUD(增刪改查)的方法進行操作其中
-
insert,新增資料
-
update,更新資料
-
delete,刪除資料
-
query,查詢資料
不同於SQLiteDatebase, ContentResolver中的CRUD是使用一個Uri引數代替,這個引數被稱為內容引數,由兩部分組成:authority和path。authority主要用來對不同應用進行區分,path用於對同一個應用的不同表進行區分
例如:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 新增資料 Uri uri = Uri.parse("content://com.example.databasetest.provider/book"); ContentValues values = new ContentValues(); values.put("name", "A Clash of Kings"); values.put("author", "George Martin"); values.put("pages", 1040); values.put("price", 55.55); Uri newUri = getContentResolver().insert(uri, values); newId = newUri.getPathSegments().get(1); } }); Button queryData = (Button) findViewById(R.id.query_data); queryData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 查詢資料 Uri uri = Uri.parse("content://com.example.databasetest.provider/book"); Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor. getColumnIndex("name")); String author = cursor.getString(cursor. getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex ("pages")); double price = cursor.getDouble(cursor. getColumnIndex("price")); Log.d("MainActivity", "book name is " + name); Log.d("MainActivity", "book author is " + author); Log.d("MainActivity", "book pages is " + pages); Log.d("MainActivity", "book price is " + price); } cursor.close(); } } }); Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 更新資料 Uri uri = Uri.parse("content://com.example.databasetest.provider/book/" + newId); ContentValues values = new ContentValues(); values.put("name", "A Storm of Swords"); values.put("pages", 1216); values.put("price", 24.05); getContentResolver().update(uri, values, null, null); } }); Button deleteData = (Button) findViewById(R.id.delete_data); deleteData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 刪除資料 Uri uri = Uri.parse("content://com.example.databasetest.provider/book/" + newId); getContentResolver().delete(uri, null, null); } }); }
似乎很簡單的樣子,但是這樣就一定安全嗎?或者說是所有人都用這個方法去共享資料的嗎,如果不是呢?這就要說到自己建立內容提供器
繼承ContentProvider,然後實現他的六個抽象方法即可
-
onCreate()
-
query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
-
insert(Uri uri,ContentValues values)
-
updaya(Uri uri,ContentValues values)
-
updata(Uri uri,ContenValues values,String selection,String[]selectionArgs)
-
delete(Uri uri,String selection,String[] selectionArgs)
-
getType(Uri uri)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2682078/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android Content Provider SecurityAndroidIDE
- Android深入四大元件(五)Content Provider的啟動過程Android元件IDE
- 第八章:四大元件之Content Provider元件IDE
- android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetAndroidXMLIDE
- angularJS中ProviderAngularJSIDE
- Android4開發入門經典 之 第九部分:Content Provider【私塾線上原創】AndroidIDE
- android: failed to find provider info for downloadsAndroidAIIDE
- 20170104第一行程式碼第七章Content Provider行程IDE
- android-Making Your App Content Searchable by Google,Specifying App Content for IndexingAndroidAPPGoIndex
- android TV-Recommending TV Content,Android
- content = content==null? content="":content; 三目運算子用法例項Null
- Django中content_type的使用Django
- HTTP協議中Content-TypeHTTP協議
- CSS中content屬性的妙用CSS
- android.content.ActivityNotFoundException:UnabletofindexplicitactivityclasshaveyoudeclaredthisactivityinyourAndroidManifest.xml?AndroidExceptionIndexXML
- Android資料儲存之Content Providers薦AndroidIDE
- Android7.0行為變更:適配File ProviderAndroidIDE
- HTTP 協議中的 Content-EncodingHTTP協議Encoding
- 如何在 Laravel 5.1 中建立服務 Service ProviderLaravelIDE
- JNI開發:Class android.content.Context could not be foundAndroidContext
- .Net 如何修改 HttpHeaders 中的 Content-DispositionHTTPHeader
- 請求協議中的content-type頭協議
- CSS contentCSS
- SCSS @contentCSS
- AngularJS服務中serivce,factory,provider的區別AngularJSIDE
- Document Provider ExtensionsIDE
- Download ProviderIDE
- Request和Response的HTTPHeader中的Content-TypeHTTPHeader
- provider之selectorIDE
- Laravel 2.3 Service ProviderLaravelIDE
- 【SQLServer】The provider supports the interfaceSQLServerIDE
- Oracle Data Provider for .NETOracleIDE
- Content Security Policy
- ISO in CSS contentCSS
- Flutter狀態管理Provider(三)基於Provider的程式碼框架FlutterIDE框架
- java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getI...JavaNullExceptionAndroidIntent
- 18、 Caused by: java.lang.NoSuchMethodException: [class android.content.Context..AttributeSetJavaExceptionAndroidContext
- android-Optimizing Content for the Assistant,Handling App LinksAndroidAPP