日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android】Android中ContentProvider组件详解

發布時間:2024/4/20 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android】Android中ContentProvider组件详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文來自:http://blog.csdn.net/zuolongsnail/article/details/6566317

ContentProvider(內容提供者)是Android中的四大組件之一。主要用于對外共享數據,也就是通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數據進行操作。ContentProvider分為系統的和自定義的,系統的也就是例如聯系人,圖片等數據。

?

以下這段是Google Doc中對ContentProvider的大致概述。
內容提供者將一些特定的應用程序數據供給其它應用程序使用。數據可以存儲于文件系統、SQLite數據庫或其它方式。內容提供者繼承于ContentProvider 基類,為其它應用程序取用和存儲它管理的數據實現了一套標準方法。然而,應用程序并不直接調用這些方法,而是使用一個 ContentResolver 對象,調用它的方法作為替代。ContentResolver可以與任意內容提供者進行會話,與其合作來對所有相關交互通訊進行管理。

?

1.ContentProvider
Android提供了一些主要數據類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等??稍赼ndroid.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的數據,當然前提是已獲得適當的讀取權限。
主要方法:
public boolean?onCreate() 在創建ContentProvider時調用
public Cursor?query(Uri, String[], String, String[], String) 用于查詢指定Uri的ContentProvider,返回一個Cursor
public Uri?insert(Uri, ContentValues) 用于添加數據到指定Uri的ContentProvider中
public int?update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的數據
public int?delete(Uri, String, String[]) 用于從指定Uri的ContentProvider中刪除數據
public String?getType(Uri) 用于返回指定的Uri中的數據的MIME類型
*如果操作的數據屬于集合類型,那么MIME類型字符串應該以vnd.android.cursor.dir/開頭。
例如:要得到所有person記錄的Uri為content://contacts/person,那么返回的MIME類型字符串為"vnd.android.cursor.dir/person"。
*如果要操作的數據屬于非集合類型數據,那么MIME類型字符串應該以vnd.android.cursor.item/開頭。
例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那么返回的MIME類型字符串應為"vnd.android.cursor.item/person"。

?

2.ContentResolver
當外部應用需要對ContentProvider中的數據進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver對象,可以使用Context提供的getContentResolver()方法。

[java]?view plaincopy
  • ContentResolver?cr?=?getContentResolver();??

  • ContentResolver提供的方法和ContentProvider提供的方法對應的有以下幾個方法。
    public Uri?insert(Uri uri, ContentValues values) 用于添加數據到指定Uri的ContentProvider中。
    public int?delete(Uri uri, String selection, String[] selectionArgs) 用于從指定Uri的ContentProvider中刪除數據。
    public int?update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的數據。
    public Cursor?query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查詢指定Uri的ContentProvider。

    ?

    3.Uri
    Uri指定了將要操作的ContentProvider,其實可以把一個Uri看作是一個網址,我們把Uri分為三部分。
    第一部分是"content://"??梢钥醋魇蔷W址中的"http://"。
    第二部分是主機名或authority,用于唯一標識這個ContentProvider,外部應用需要根據這個標識來找到它??梢钥醋魇蔷W址中的主機名,比如"blog.csdn.net"。
    第三部分是路徑名,用來表示將要操作的數據。可以看作網址中細分的內容路徑。

    ?

    下面是用ContentProvider讀取聯系人數據,屬于系統數據。完整代碼下載:android_contentprovider_system.rar

    注意:這里的聯系人操作有點亂,關鍵是我還不是很熟,SDK1.6和SDK2.1的聯系人操作很有很大不同,希望哪位大俠指點一下。

    [java]?view plaincopy
  • /**?
  • ?*?MainActivity?
  • ?*??
  • ?*?@author?zuolongsnail?
  • ?*/??
  • public?class?MainActivity?extends?Activity?{??
  • ????private?EditText?nameET;??
  • ????private?EditText?numberET;??
  • ????private?Button?insertBtn;??
  • ????private?Button?deleteBtn;??
  • ????private?Button?queryBtn;??
  • ????private?ListView?contentView;??
  • ??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ????????nameET?=?(EditText)?findViewById(R.id.name);??
  • ????????numberET?=?(EditText)?findViewById(R.id.number);??
  • ????????insertBtn?=?(Button)?findViewById(R.id.insert);??
  • ????????deleteBtn?=?(Button)?findViewById(R.id.delete);??
  • ????????queryBtn?=?(Button)?findViewById(R.id.query);??
  • ????????//?用于顯示數據??
  • ????????contentView?=?(ListView)?findViewById(R.id.content);??
  • ????????insertBtn.setOnClickListener(new?OperateOnClickListener());??
  • ????????deleteBtn.setOnClickListener(new?OperateOnClickListener());??
  • ????????queryBtn.setOnClickListener(new?OperateOnClickListener());??
  • ????}??
  • ??
  • ????class?OperateOnClickListener?implements?OnClickListener?{??
  • ????????@Override??
  • ????????public?void?onClick(View?v)?{??
  • ????????????String?name?=?nameET.getText().toString();??
  • ????????????String?number?=?numberET.getText().toString();??
  • ????????????Person?p?=?new?Person(name,?number);??
  • ????????????switch?(v.getId())?{??
  • ????????????//?插入數據??
  • ????????????case?R.id.insert:??
  • ????????????????insert(p);??
  • ????????????????view();??
  • ????????????????break;??
  • ????????????//?刪除數據??
  • ????????????case?R.id.delete:??
  • ????????????????delete(name);??
  • ????????????????view();??
  • ????????????????break;??
  • ????????????//?查詢數據??
  • ????????????case?R.id.query:??
  • ????????????????view();??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????//?顯示數據??
  • ????private?void?view()?{??
  • ????????Cursor?c?=?query("");??
  • ????????ListAdapter?listAdapter?=?new?SimpleCursorAdapter(this,?R.layout.list,??
  • ????????????????c,?new?String[]?{?People._ID,?People.NAME,?People.NUMBER?},??
  • ????????????????new?int[]?{?R.id.id,?R.id.name,?R.id.number?});??
  • ????????contentView.setAdapter(listAdapter);??
  • ????}??
  • ??
  • ????//?插入聯系人??
  • ????private?void?insert(Person?p)?{??
  • ????????//?獲得ContentResolver對象??
  • ????????ContentResolver?cr?=?getContentResolver();??
  • ????????ContentValues?values?=?new?ContentValues();??
  • ????????values.put(People.NAME,?p.name);??
  • ????????//?表示是否把聯系人添加到收藏(加星),1表示加入,0表示不加入,這行代碼注釋默認是不加入。??
  • ????????values.put(Contacts.People.STARRED,?1);??
  • ????????Uri?uri?=?Contacts.People.createPersonInMyContactsGroup(cr,?values);??
  • ????????//?獲得聯系人People表的Uri??
  • ????????Uri?url?=?Uri.withAppendedPath(uri,??
  • ????????????????Contacts.People.Phones.CONTENT_DIRECTORY);??
  • ????????values.clear();??
  • ????????values.put(Contacts.Phones.TYPE,?Contacts.Phones.NUMBER);??
  • ????????values.put(Contacts.Phones.NUMBER,?p.number);??
  • ????????//?插入操作??
  • ????????cr.insert(url,?values);??
  • ????}??
  • ??
  • ????//?插入聯系人??
  • ????private?void?delete(String?name)?{??
  • ????????//?獲得ContentResolver對象??
  • ????????ContentResolver?cr?=?getContentResolver();??
  • ????????Uri?url?=?Contacts.People.CONTENT_URI;??
  • ????????//?設置刪除條件??
  • ????????String?where?=?People.NAME?+?"=?";??
  • ????????String[]?selectionArgs?=?{?name?};??
  • ????????cr.delete(url,?where,?selectionArgs);??
  • ????}??
  • ??
  • ????//?查詢聯系人??
  • ????private?Cursor?query(String?name)?{??
  • ????????//?獲得ContentResolver對象??
  • ????????ContentResolver?cr?=?getContentResolver();??
  • ????????Uri?uri?=?Contacts.People.CONTENT_URI;??
  • ????????//?查詢對象??
  • ????????String[]?projection?=?{?People._ID,?People.NAME,?People.NUMBER?};??
  • ????????//?設置查詢條件,這里我把selection和selectionArgs參數都設為null,表示查詢全部數據??
  • ????????String?selection?=?null;??
  • ????????String[]?selectionArgs?=?null;??
  • ????????if?(!"".equals(name))?{??
  • ????????????selection?=?People.NAME?+?"=?";??
  • ????????????selectionArgs?=?new?String[]?{?name?};??
  • ????????}??
  • ????????//?設置排序條件??
  • ????????String?sortOrder?=?Contacts.People._ID;??
  • ????????Cursor?c?=?cr.query(uri,?projection,?selection,?selectionArgs,??
  • ????????????????sortOrder);??
  • ????????//?if?(c.moveToFirst())?{??
  • ????????//?for?(int?i?=?0;?i?<?c.getCount();?i++)?{??
  • ????????//?c.moveToPosition(i);??
  • ????????//?String?name?=?c.getString(c.getColumnIndexOrThrow(People.NAME));??
  • ????????//?String?number?=?c.getString(c??
  • ????????//?.getColumnIndexOrThrow(People.NUMBER));??
  • ????????//?}??
  • ????????//?}??
  • ????????return?c;??
  • ????}??
  • }??
  • 程序截圖:?

    總結

    以上是生活随笔為你收集整理的【Android】Android中ContentProvider组件详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。