Android是如何实现应用程序之间数据共享的?一个应用程序能够将本身的数据彻底暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库仍是使用文件,仍是经过网上得到,这些一切都不重要,重要的是外界能够经过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),固然须要必定的权限才能够。java
如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序能够经过实现一个Content provider的抽象接口将本身的数据彻底暴露出去,并且Content providers是以相似数据库中表的方式将数据暴露。Content providers存储和检索数据,经过它可让全部的应用程序访问到,这也是应用程序之间惟一共享数据的方法。要想使应用程序的数据公开化,可经过2种方法:建立一个属于你本身的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型而且有写入Content provider的权限。android
如何经过一套标准及统一的接口获取其余应用程序暴露的数据?Android提供了ContentResolver,外界的程序能够经过ContentResolver接口访问ContentProvider提供的数据。数据库
当前篇主要说明,如何获取其它应用程序共享的数据,好比获取Android 手机电话薄中的信息。网络
在学习如何获取ContentResolver前,有个名词是必须了解的:URI。URI是网络资源的定义,在Android中赋予其更广阔的含义,先看个例子,以下:
将其分为A,B,C,D 4个部分:
A:标准前缀,用来讲明一个Content Provider控制这些数据,没法改变的;
B:URI的标识,它定义了是哪一个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的惟一性,它必须是一个完整的、小写的 类名。这个标识在<provider> 元素的 authorities属性中说明:
<provider name=”.TransportationProvider” authorities=”com.example.transportationprovider” . . . >
C:路径,Content Provider使用这些路径来肯定当前须要生什么类型的数据,URI中可能不包括路径,也可能包括多个;
D:若是URI中包含,表示须要获取的记录的ID;若是没有ID,就表示返回所有;
因为URI一般比较长,并且有时候容易出错,切难以理解。因此,在Android当中定义了一些辅助类,而且定义了一些常量来代替这些长字符串,例如:People.CONTENT_URIapp
看完这些介绍,你们必定就明白了,ContentResolver是经过URI来查询ContentProvider中提供的数据。除了URI之外,还必须知道须要获取的数据段的名称,以及此数据段的数据类型。若是你须要获取一个特定的记录,你就必须知道当前记录的ID,也就是URI中D部分。ide
前面也提到了Content providers是以相似数据库中表的方式将数据暴露出去,那么ContentResolver也将采用相似数据库的操做来从Content providers中获取数据。如今简要介绍ContentResolver的主要接口,以下:函数
返回值 | 函数声明 |
final Uri | insert(Uri url, ContentValues values)Inserts a row into a table at the given URL. |
final int | delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI. |
final Cursor | query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set. |
final int | update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI. |
看到这里,是否感受与数据库的操做基本同样的?就是这样的,详细解析请参考Android SQLite解析篇中的说明,不在此详细说明。学习
最后一个问题:如何获取ContentResolver?调用getContentResolver (),例如:ContentResolver cr = getContentResolver();this
以上就彻底介绍了如何获取、使用ContentResolver,启动Eclipes,制做一个完整的实例以下:
打开showcontent.java,修改以下:url
package moandroid.showcontact; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.provider.Contacts.Phones; import android.widget.ListAdapter; import android.widget.SimpleCursorAdapter; public class showcontact extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null,null, null); startManagingCursor(c); ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter); } }
而后在AndroidManifest.XML中<application>元素前增长以下许可:
<uses-permission android:name=”android.permission.READ_CONTACTS” />
最后运行程序,在模拟器启动后,单击Menu返回到Home界面,打开Contacts选择Contacts标签页,添加2个联系人信息。返回到Home,选择moandroid.showcontact运行,刚添加的2个联系人信息将显示在界面上,以下:
ContentResolver的使用极大的方便了应用程序之间共享数据,如何将应用程序的数据彻底暴露给给他应用程序使用了