乐读文学

Android从入门到精通

乐读文学 > 科普学习 > Android从入门到精通

第129页

书籍名:《Android从入门到精通》    作者:明日科技




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所示。