4 四大组件之ContentProvider
组件篇——ContentProvider
数据存储方式:
SharedPreferences
文件存储
SQLite
其他还有网络存储等
我们上面介绍的四种存储方式,都只是在单独一个应用程序之中达到一个数据的共享,只适合在本应用中存储数据,而不能实现多个应用程序之中达到一个数据的共享,此时我们使用的是ContentProvider来实现:也就是说我们在写ContentProvider的时候就决定了一个其他程序访问我们的数据的时候的权限和功能的大小。
使用CotentProivder来实现各个进程之间共享数据
ContentProvider可以提供一个统一的接口使上层调用者不用关心数据存储的细节问题

如何实现ContentProvider?
- 继承抽象类ContentProvider实现一系列针对于数据的增删改查等方法
-需要在AndroidMainfest.xml中完成对ContentProvider的注册
<provider
android:name="com.imooc.MusicProvider"
android:authorities="com.provider.music"
></provider>
-注册的authorities属性值是全局唯一的
4-2 查询联系人id与姓名

|
A:标准前缀,表明这个数据被一个内容提供器所控制,不可修改 B:URI的权限部分;它标识这个内容提供器。对于第三方应用程序,这应该是一个全称类名以确保唯一性 C:用来判断请求数据类型的路径,这可以是0或多个段长,可以没有 D:被请求的特定记录的ID |




4-3 查询联系人电话号码
MyContentProvider.java
package com.example.android3_file1; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; public class MyContentProvider extends ContentProvider{ //比如你实现了增和删 @Override//根据Uri删除selection指定的条件所匹配的全部记录 public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override//返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录 //那么MIME类型字符串 就是以vnd.android.dir/开头 // 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头 public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override//根据Uri插入Values对应的数据 public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override//在ContetnProvider创建后被调用 public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override//根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override//根据uri修改selection指定的条件所匹配的全部记录 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
MainActivity .java
package com.example.test; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.Contacts; import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr = getContentResolver(); Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null); if (c != null) { while (c.moveToNext()) { int id = c.getInt(c.getColumnIndex("_id")); Log.i("info", "_id:" + id); Log.i("info", "name:" + c.getString(c.getColumnIndex("display_name"))); Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE }, Phone.CONTACT_ID + "=" + id, null, null); // 根据联系人ID查询出联系人的电话号码 if (c1 != null) { while (c1.moveToNext()) { int type = c1.getInt(c1.getColumnIndex(Phone.TYPE)); if (type == Phone.TYPE_HOME) { Log.i("info", "家庭电话:" + c1.getString(c1 .getColumnIndex(Phone.NUMBER))); } else if (type == Phone.TYPE_MOBILE) { Log.i("info", "手机:" + c1.getString(c1 .getColumnIndex(Phone.NUMBER))); } } c1.close(); } // 根据联系人的ID去查询出联系人的邮箱地址 Cursor c2 = cr.query(Email.CONTENT_URI, new String[] { Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id, null, null); if (c2 != null) { while (c2.moveToNext()) { int type = c2.getInt(c2.getColumnIndex(Email.DATA)); if (type == Email.TYPE_WORK) { Log.i("info", "工作邮箱:" + c2.getString(c2 .getColumnIndex(Email.DATA))); } } c2.close(); } } c.close(); } } }
<uses-permission android:name="android.permission.READ_CONTACTS"/>


4-4 查询E_mail与增加联系人

MainActivity.java
package com.example.test; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr = getContentResolver(); //向联系人中 插入一行数据 ContentValues values = new ContentValues(); Uri uri = cr.insert(RawContacts.CONTENT_URI, values); Long raw_contact_id = ContentUris.parseId(uri); values.clear(); //插入人名 values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id); values.put(StructuredName.DISPLAY_NAME, "张三三"); values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); uri = cr.insert(Data.CONTENT_URI, values); //插入电话信息 values.clear(); values.put(Phone.RAW_CONTACT_ID,raw_contact_id); values.put(Phone.NUMBER,"13333333333"); values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE); uri = cr.insert(Data.CONTENT_URI, values); } }
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

浙公网安备 33010602011771号