【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,比如音频、视频、图片和私人通讯录等。可在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 plain copy
  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 plain copy
  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. }  

程序截图: 

相关文章
|
12天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
86 0
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
48 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
204 5
|
2月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
3月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
3月前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
41 0
下一篇
无影云桌面