如何实现 ContentProvider?
1. 继承抽象类 ContentProvider 实现一系列针对于数据的增删改查等方法;
2. 需在 AndroidManifest.xml 中完成对 ContentProvider的注册。
<provider
android:name="com.imooc.MusicProvider"
android:authorities="com.provider.music" ></provider>
注:注册的anthorities的属性值,是全局唯一的。
第三方的访问能力完全取决于你自定义的ContentProvider,如果定义的ContentProvider只实现查询功能,那么第三方程序就只能做查询的操作,不能做其他的操作。
继承 ContentProvider 之后实现的几个方法:
onCreate() :在ContentProvider创建后使用。
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根据Uri查询selection指定的条件所匹配的全部记录,并且可以指定查询哪些字段、以什么方式排序。
insert(Uri uri, ContentValues values):根据Uri插入values对应的数据。
delete(Uri uri, String selection, String[] selectionArgs):根据Uri删除selection指定的条件所匹配的全部记录。
update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs):根据Uri修改selection指定的条件所匹配的全部记录。
比较值得注意的如下:
getType(Uri uri):返回当前Uri的 MIME 类型。
如果当前的Uri包含多条记录,那么 MIME 类型字符串就以 vnd.android.dir/ 开头。
如果该Uri对应的数据只有一条记录,那么 MIME 类型字符串就以 vnd.android.cursor.item/ 开头
本章要实现的功能
1. 使用系统提供的 ContentProvider
- 查询联系人
- 增加联系人
2. 使用自定义的ContentProvider
- 自定义
------------------
必须添加的权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
-----------------
查询方法——query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)的解析:
联系人的Uri地址:ContactsContrac。Contacts.CONTENT_URI。
查询的内容(projection),可以直接自定义一个数组表示:new String[]{Contacts._ID,Contacts.DISPLAY_NAME},其中 Contacts._ID,Contacts.DISPLAY_NAME 都是系统写死了的常量,都可以直接调用,分别表示主键和人名。
查询的条件(selection):不需要的话就写 null,另外selectionArgs也写成null。
排序(sortOrder)采用默认排序,所以也写成 null。
ContentProvider:
1. 使用 ContentResolver 操作 ContentProvider 中的数据:
当外部应用需要对 ContentProvider 中的数据进行增删改查的时候,可以使用 ContentResolver 类来完成。
2. 使用 Activity 提供的 getContentResolver() 方法获取 ContentResolver 对象。
3. ContentResolver 类提供了与 ContentProvider 类相同签名的四个方法:
-- public Uri insert(Uri uri,ContentValues values).该方法用于往ContentProvider里面添加数据。
-- public int delete(Uri uri,String selection,String[] selectionArgs).该方法从ContentProvider中删除数据。
-- public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs).该方法用于更新ContentProvider里面的数据。
-- public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder).该方法用于从ContentProvider中获取数据。
1 public class MainActivity extends ActionBarActivity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.fragment_main);
7 ContentResolver cr = getContentResolver();
8 //查询ID和名字
9 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
10 new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null,
11 null, null);
12 if (cursor != null) {
13 while (cursor.moveToNext()) {
14 int id = cursor.getInt(cursor.getColumnIndex("_id"));
15 Log.i("-->>", "id:" + id);
16 Log.i("-->>","name:"+ cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME)));
17 //查询电话号码
18 Cursor cursor2 = cr.query(Phone.CONTENT_URI,
19 new String[] {Phone.NUMBER, Phone.TYPE },
20 Phone.CONTACT_ID + "=" + id, null, null);
21 if (cursor2 != null) {
22 while (cursor2.moveToNext()) {
23 int type = cursor2.getInt(cursor2.getColumnIndex(Phone.TYPE));
24 if (type == Phone.TYPE_HOME) {
25 Log.i("--->","家庭电话:"+ cursor2.getString(cursor2.getColumnIndex(Phone.NUMBER)));
26 }
27 else if (type == Phone.TYPE_MOBILE) {
28 Log.i("--->","手机:"+ cursor2.getString(cursor2.getColumnIndex(Phone.NUMBER)));
29 //查询邮箱
30 Cursor cursor3 = cr.query(Email.CONTENT_URI,
31 new String[] { Email.DATA,Email.TYPE },
32 Email.CONTACT_ID + "=" + id, null,null);
33 if (cursor3 != null) {
34 while (cursor3.moveToNext()) {
35 int type1 = cursor3.getInt(cursor3.getColumnIndex(Email.TYPE));
36 if (type1 == Email.TYPE_WORK) {
37 Log.i("--->>","工作邮箱:"+ cursor3.getString(cursor3.getColumnIndex(Email.DATA)));
38 }
39
40 }
41 cursor3.close();
42 }
43
44 }
45 cursor2.close();
46 }
47
48 }
49 }
50
51 }
52 }
53 }
1 public class MainActivity extends ActionBarActivity {
2 // 添加联系人
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.fragment_main);
7 ContentResolver cr = getContentResolver();
8 // 向联系人中插入一行数据
9 ContentValues values = new ContentValues();
10 Uri uri = cr.insert(RawContacts.CONTENT_URI, values);
11 Long raw_Content_id = ContentUris.parseId(uri);
12 values.clear();
13 // 插入人名
14 values.put(StructuredName.RAW_CONTACT_ID, raw_Content_id);
15 values.put(StructuredName.DISPLAY_NAME, "zlj");
16 values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
17 cr.insert(Data.CONTENT_URI, values);
18 values.clear();
19 // 插入电话信息,需要指定电话号码以及类型,尤其是类型,比较容易忘记去添加
20 values.put(Phone.RAW_CONTACT_ID, raw_Content_id); // 先确定主键,然后才能正确地添加信息
21 values.put(Phone.NUMBER, "1333333333");
22 values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
23 cr.insert(Data.CONTENT_URI, values);
24 }
25
26 }