Android攻城狮数据存储之ContentProvider(内容提供者)

如何实现 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 }

 









posted @ 2017-04-19 20:08  张兮兮  阅读(212)  评论(0编辑  收藏  举报