ontentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

 

以下这段是Google Doc中对ContentProvider的大致概述。
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

 

1.ContentProvider
Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.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
  1. 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://"。可以看作是网址中的"http://"。
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.csdn.net"。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

 

下面是用ContentProvider读取联系人数据,属于系统数据。完整代码下载:android_contentprovider_system.rar

注意:这里的联系人操作有点乱,关键是我还不是很熟,SDK1.6和SDK2.1的联系人操作很有很大不同,希望哪位大侠指点一下。

[java] view plaincopy
  1. /** 
  2.  * MainActivity 
  3.  *  
  4.  * @author zuolongsnail 
  5.  */  
  6. public class MainActivity extends Activity {  
  7.     private EditText nameET;  
  8.     private EditText numberET;  
  9.     private Button insertBtn;  
  10.     private Button deleteBtn;  
  11.     private Button queryBtn;  
  12.     private ListView contentView;  
  13.   
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         nameET = (EditText) findViewById(R.id.name);  
  19.         numberET = (EditText) findViewById(R.id.number);  
  20.         insertBtn = (Button) findViewById(R.id.insert);  
  21.         deleteBtn = (Button) findViewById(R.id.delete);  
  22.         queryBtn = (Button) findViewById(R.id.query);  
  23.         // 用于显示数据  
  24.         contentView = (ListView) findViewById(R.id.content);  
  25.         insertBtn.setOnClickListener(new OperateOnClickListener());  
  26.         deleteBtn.setOnClickListener(new OperateOnClickListener());  
  27.         queryBtn.setOnClickListener(new OperateOnClickListener());  
  28.     }  
  29.   
  30.     class OperateOnClickListener implements OnClickListener {  
  31.         @Override  
  32.         public void onClick(View v) {  
  33.             String name = nameET.getText().toString();  
  34.             String number = numberET.getText().toString();  
  35.             Person p = new Person(name, number);  
  36.             switch (v.getId()) {  
  37.             // 插入数据  
  38.             case R.id.insert:  
  39.                 insert(p);  
  40.                 view();  
  41.                 break;  
  42.             // 删除数据  
  43.             case R.id.delete:  
  44.                 delete(name);  
  45.                 view();  
  46.                 break;  
  47.             // 查询数据  
  48.             case R.id.query:  
  49.                 view();  
  50.                 break;  
  51.             }  
  52.         }  
  53.     }  
  54.   
  55.     // 显示数据  
  56.     private void view() {  
  57.         Cursor c = query("");  
  58.         ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,  
  59.                 c, new String[] { People._ID, People.NAME, People.NUMBER },  
  60.                 new int[] { R.id.id, R.id.name, R.id.number });  
  61.         contentView.setAdapter(listAdapter);  
  62.     }  
  63.   
  64.     // 插入联系人  
  65.     private void insert(Person p) {  
  66.         // 获得ContentResolver对象  
  67.         ContentResolver cr = getContentResolver();  
  68.         ContentValues values = new ContentValues();  
  69.         values.put(People.NAME, p.name);  
  70.         // 表示是否把联系人添加到收藏(加星),1表示加入,0表示不加入,这行代码注释默认是不加入。  
  71.         values.put(Contacts.People.STARRED, 1);  
  72.         Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);  
  73.         // 获得联系人People表的Uri  
  74.         Uri url = Uri.withAppendedPath(uri,  
  75.                 Contacts.People.Phones.CONTENT_DIRECTORY);  
  76.         values.clear();  
  77.         values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);  
  78.         values.put(Contacts.Phones.NUMBER, p.number);  
  79.         // 插入操作  
  80.         cr.insert(url, values);  
  81.     }  
  82.   
  83.     // 插入联系人  
  84.     private void delete(String name) {  
  85.         // 获得ContentResolver对象  
  86.         ContentResolver cr = getContentResolver();  
  87.         Uri url = Contacts.People.CONTENT_URI;  
  88.         // 设置删除条件  
  89.         String where = People.NAME + "=?";  
  90.         String[] selectionArgs = { name };  
  91.         cr.delete(url, where, selectionArgs);  
  92.     }  
  93.   
  94.     // 查询联系人  
  95.     private Cursor query(String name) {  
  96.         // 获得ContentResolver对象  
  97.         ContentResolver cr = getContentResolver();  
  98.         Uri uri = Contacts.People.CONTENT_URI;  
  99.         // 查询对象  
  100.         String[] projection = { People._ID, People.NAME, People.NUMBER };  
  101.         // 设置查询条件,这里我把selection和selectionArgs参数都设为null,表示查询全部数据  
  102.         String selection = null;  
  103.         String[] selectionArgs = null;  
  104.         if (!"".equals(name)) {  
  105.             selection = People.NAME + "=?";  
  106.             selectionArgs = new String[] { name };  
  107.         }  
  108.         // 设置排序条件  
  109.         String sortOrder = Contacts.People._ID;  
  110.         Cursor c = cr.query(uri, projection, selection, selectionArgs,  
  111.                 sortOrder);  
  112.         // if (c.moveToFirst()) {  
  113.         // for (int i = 0; i < c.getCount(); i++) {  
  114.         // c.moveToPosition(i);  
  115.         // String name = c.getString(c.getColumnIndexOrThrow(People.NAME));  
  116.         // String number = c.getString(c  
  117.         // .getColumnIndexOrThrow(People.NUMBER));  
  118.         // }  
  119.         // }  
  120.         return c;  
  121.     }  
  122. }  

程序截图: 

热搜词

valox 420seoserver2008服务器如何退域session ddos高防iphonex怎么分别oneasiahost 优惠.travel域名注册vestacp密码all in one seo下载interserver主机server 2003把 c盘分区hostigation优惠码sqlserver 批量导出存储过程kangle sql server域名状态 serverholdiphone上怎么设置邮箱server 2003 双网卡双线路live域名无法备案greenvaluehost 评测vertu高防iphone 6邮箱主机名sqlserver云数据库sqlserver导入1g sqlserver2003如何创建ftpserverhub免费空间sql server 虚拟windows2003 everyonewinserver2008r2防ddosserver 2008 分区server 2003 安装phpfilezilla server设置重启sqlserver 命令ovh xenserver1核2g windows serversqlserver 租用love 域名无法备案vps 不用windows servervalox 420seo 塑料 表面发亮高防iphone6ssql server 服务帐户mysql server2000server2003安全设置高防iphone6s手机windows server 云桌面vestacp 安装windowsserver2012云主机虚拟主机 ioncubesever2003建立vpngithub education 邮箱域名解析dns everdnsmssqlserver数据库sqlserver2005无法连接服务器域名状态inactivewindowsserver2003 分区iphone4s高防高防iphone8对比iPhone8iphone8plus高防sql server 服务器租用seo display nonesql server 多少个数据库love域名 发生了什么高防iphonexsgodaddy nameserversipone x max 高防windows server 2003 ddos防火墙onevps新加坡怎么样高防iphone天天打广告语域名 inactivesqlserver数据库报价sqlserver 数据库 价格kvm 安装 server2008r2xenserver 如何导出vps摸板域名 reserved 能注册嘛yonex高防品值多少钱卸载sql server服务管理器iphone发件服务器主机名eve定制主机sql server 2008 购买filezilla server如何使用xenserver如何重启vpsxenserver vps 重置密码打开sql server企业管理器美国verisign公司all in one seo汉化vestacp 卸载iphone远程云主机高防iphone7重装回安卓wp all in one seo自定义applicationlove 注册账户innovative linkage2003 server 架设虚拟主机zone 域名是哪里的高防iphone6sql server 空间windows live注册邮箱weloveservers 8sql server空间数据库sql server 2000新建数据库valox 420seo-1066高防iphone5s