在Android中内容提供者主要是用于不同程序之间的数据共享。内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序的数据,另一种是创建自己的内容提供器,供其他的程序访问。
使用现有的内容提供器来读取和操作相应程序的数据
ContentResolve中提供了一系列的方法用于对数据进行增删改查的操作,其中,insert()用于添加数据,update()用于数据更新,delete()方法用于删除数据,query()用于数据的查询。
在ContentResolve中,使用内容URI来确定资源,URI由两个部分组成,权限和路径。权限一般由应用程序的报名+provider 组成,路径用于区分同一程序下的不同表,一般加在权限后面。完整的内容URI 还要加入协议声明,如“content://com.example.app.provider/table1"。当我们得到URI字符串后,要把它解析成为Uri对象使用Uri.parse()方法。
query()方法需要传入五个参数。第一个Uri指定查询某个应用程序下的某一张表,第二个参数指定查询的列名,第三。四个参数指定查询条件,第五个参数指定排列的顺序。该方法返回一个cursor对象,通过遍历cursor对象,取出相应的数据。
insert()方法需要传入两个参数。第一是Uri,第二个是ContentValue对象,指定要插入的数据
update()方法需要传入四个参数,第一个是Uri,第二是ContentValue对象,第三、四个参数指定修改的数据。
delete()方法需要三个参数。第一个是Uri,第二、三个是约束条件指定要删除的对象。
下面是一个读取联系人的看具体代码:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 3 android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 4 android:paddingRight="@dimen/activity_horizontal_margin" 5 android:paddingTop="@dimen/activity_vertical_margin" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 tools:context=".MainActivity" 8 android:orientation="vertical" 9 > 10 11 <ListView 12 android:layout_width="match_parent" 13 android:layout_height="match_parent" 14 android:id="@+id/contacts_view" 15 ></ListView> 16 17 </LinearLayout>
Java代码
1 public class MainActivity extends AppCompatActivity { 2 3 4 ListView contactsView; 5 ArrayAdapter<String> adapter; 6 7 List<String> contactsList = new ArrayList<String>(); 8 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 contactsView = (ListView)findViewById(R.id.contacts_view); 15 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList); 16 contactsView.setAdapter(adapter); 17 18 readContacts(); 19 20 } 21 22 private void readContacts(){ 23 Cursor cursor = null; 24 try { 25 cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 26 null,null,null,null); 27 while (cursor.moveToNext()){ 28 String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 29 String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 30 contactsList.add(name+" "+number); 31 } 32 33 }catch (Exception e){ 34 e.printStackTrace(); 35 } 36 } 37 38 39 }
因为要访问联系人,所以必须添加权限。
<uses-permission android:name="android.permission.READ_CONTACTS"/>