第129页
android:orientation="vertical" >
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:textSize="25dp" />
(2)创建RetrieveDataActivity类,该类继承了Activity类。在onCreate()方法中获得布局文件中定义的标签,在自定义的getQueryData()方法中获得查询数据,代码如下:
public class RetrieveDataActivity extends Activity {
private String[] columns = { Contacts._ID, //希望获得ID值
Contacts.DISPLAY_NAME, //希望获得姓名
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.result); //获得布局文件中的标签
tv.setText(getQueryData()); //为标签设置数据
}
private String getQueryData() {
StringBuilder sb = new StringBuilder(); //用于保存字符串
ContentResolver resolver = getContentResolver(); //获得ContentResolver对象
Cursor cursor = resolver.query(Contacts.CONTENT_URI, columns, null, null, null); //查询记录
int idIndex = cursor.getColumnIndex(columns[0]); //获得ID记录的索引值
int displayNameIndex = cursor.getColumnIndex(columns[1]); //获得姓名记录的索引值
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {//迭代全部记录
int id = cursor.getInt(idIndex);
String displayName = cursor.getString(displayNameIndex);
sb.append(id + ": " + displayName + "\n");
}
cursor.close(); /关闭Cursor
return sb.toString(); //返回查询结果
}
}
(3)在AndroidManifest文件中增加读取联系人记录的权限,代码如下:
运行本实例,其效果如图11.5所示。
图11.5 显示联系人ID和姓名
11.3 自定义Content Provider
教学录像:光盘\TM\lx\11\自定义Content Provider.exe
如果开发人员希望共享自己的数据,则有以下两个选择:
[√]创建自定义的Content Provider(一个ContentProvider类的子类)。
[√]如果有预定义的provider,管理相同的数据类型并且有写入权限,则可以向其中增加数据。
前面已经详细介绍了如何使用系统预定义的Content Provider,下面将介绍如何自定义Content Provider。
如果自定义Content Provider,开发人员需要完成以下操作:
[√]建立数据存储系统。大多数Content Provider使用Android文件存储方法或者SQLite数据库保存数据,但是开发人员可以使用任何方式存储。Android提供了SQLiteOpenHelper类帮助创建数据库,SQLiteDatabase类帮助管理数据库。
[√]继承ContentProvider类来提供数据访问方式。
[√]在应用程序的AndroidManifest文件中声明Content Provider。
下面主要介绍继承ContentProvider类和声明Content Provider的操作。
11.3.1 继承ContentProvider类
开发人员定义ContentProvider类的子类,以便使用ContentResolver和Cursor类来共享数据。原则上,这意味着需要实现ContentProvider类定义的6个抽象方法,其语法格式如下:
public boolean onCreate()
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public Uri insert(Uri uri, ContentValues values)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public int delete(Uri uri, String selection, String[] selectionArgs)
public String getType(Uri uri)
各个方法的说明如表11.2所示。
表11.2 ContentProvider中的抽象方法及说明
方 法 说 明
onCreate() 用于初始化provider
query() 返回数据给调用者
insert() 插入新数据到Content Provider
update() 更新Content Provider中已经存在的数据
delete() 从Content Provider中删除数据
getType() 返回Content Provider数据的MIME类型
query()方法必须返回Cursor对象,用于遍历查询结果。Cursor自身是一个接口,Android提供了该接口的一些实现类,例如,SQLiteCursor能遍历存储在SQLite数据库中的数据。通过调用SQLiteDatabase类的query()方法可以获得Cursor对象,它们都位于android.database包中,其继承关系如图11.6所示。