浏览 12387 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-07
最后修改:2010-12-07
Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 Content Provider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。 让自己的数据和其他应用程序共享有两种方式:创建自己的Content Provier(即继承自ContentProvider的子类) 或者是将自己的数据添加到已有的Content Provider中去,后者需要保证现有的Content Provider和自己的数据类型相同且具有该 Content Provider的写入权限。对于Content Provider,最重要的就是数据模型(data model) 和 URI。 1.数据模型 Content Provider 将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个 "_ID" 数值字段,改字段唯一标识一条数据。 2.URI URI,每一个Content Provider 都对外提供一个能够唯一标识自己数据集(data set)的公开URI, 如果一个Content Provider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Provider 的URI 都以"content://" 开头,其中"content:"是用来标识数据是由Content Provider管理的 schema。 在几乎所有的Content Provider 的操作中都会用到URI,因此一般来讲,如果是自己开发的Content Provider,最好将URI定义为常量,这样在简化开发的同时也提高了代码的可维护性。 首先来介绍如何访问Content Provider中的数据,访问 Content Provider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对Content Provider 中的数据进行查询、插入、修改和删除等操作。 以查询为例,查询一个 Content Provider 需要掌握如下的信息。 唯一标识Content Provider 的URI 需要访问的数据字段名称。 该数据字段的数据类型 提示: 如果需要访问特定的某条数据记录,只需该记录的ID 即可。 查询Content Provider的方法有两个:ContentResolver的query() 和 Activity 对象的 managedQuery(),二者接收的参数均相同,返回的都是Cursor 对象,唯一不同的是 使用managedQuery 方法可以让Activity 来管理 Cursor 的生命周期。 被管理的Cursor 会在 Activity进入暂停状态的时候调用自己的 deactivate 方法自行卸载,而在Activity回到运行状态时会调用自己的requery 方法重新查询生成的Cursor对象。如果一个未被管理的Cursor对象想被Activity管理,可以调用Activity的 startManagingCursor方法来实现。 下面通过一个例子来说明访问Content Provider的方式,本例中通过Content Resolver对象访问Android中存储了联系人信息的Content Provider并将数据显示到TextView上。 大家先来看一下我手机上都有哪些联系人吧,见下图。 下边我们就来看代码吧比较简单了,只有一个类Activity01 package xiaohang.zhimeng; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.widget.TextView; public class Activity01 extends Activity { //查询Content Provider时希望返回的列 String [] columns = { ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID, //People._ID, //People.NAME }; Uri contactUri = ContactsContract.Contacts.CONTENT_URI; TextView tv; //Uri contaUri = Contacts.People.CONTENT_URI; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView)findViewById(R.id.tv); String result = getQueryData(); tv.setTextColor(Color.GREEN); tv.setTextSize(20.0f); tv.setText("ID\t名字\n" + result); } //获取联系人列表的信息,返回 String对象 public String getQueryData(){ String result = ""; //获取ContentResolver对象 ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(contactUri, columns, null, null, null); //获得_ID字段的索引 int idIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID); //获得Name字段的索引 int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); //遍历Cursor提取数据 for (cursor.moveToFirst();(!cursor.isAfterLast());cursor.moveToNext()) { result = result + cursor.getString(idIndex) + "\t"; result = result + cursor.getString(nameIndex)+ "\t\n"; } cursor.close(); return result; } } 下面是运行后的效果 最后在提醒大家一下不要忘记加权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> 测试平台 android2.0 源码见附件 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-18
最后修改:2011-01-18
沙发! int hasNumberColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); String count = cursor.getString(hasNumberColumnIndex);
|
|
返回顶楼 | |