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 }