使用UrI来读取数据
ContentProvider定义的URI是对于该ContentProvider是唯一的。Android中包含了的ContentProvider通过定义表示这些URI的字符串常量来实现此目的。
考虑到AndroidSDK照片那个的帮助器类定义了三个URI:
MediaStore.Image.Media.INTERAL_CONTEN_URI
MediaStore.Image.Media.EXTARNAL_CONTENT_URL
ContactsContrat.Contacts.CONTENT_URI
等效的文本URL字符串如下:
content://media/internal/images
content://media/external/images
content://com.android.contracts/contacts
给定这些URI,从联系人中获取单行联系人的代码如下
Uri peopleUri = ContactsCOntract.Contacts.CONTENT_URI;
Uri myPersonalUri = Uri.withAppendedPath(peoleUri, "23")
//Query for this record
//managedQuery is a method on Activity class
Cursor cur = managedQuery(myPersonUri,null,null,null);
在这里的例子中,代码使用根URI,添加制定的联系人ID,然后调用managedQuery的方法
作为对此URI的查询的一部分,可以指定排序顺序,要选择序列,要选择的列和where子句。
关于游标的使用
下面是关于Android游标中德一些知识:
游标是一个行集合
读取数据之前,需要使用moveToFirst(),因为游标放在第一行之前
需要知道列名
需要知道列的类型
所有字段访问方法都是基于列编号,所以必须首先将列名称转换为列编号
游标可以素以移动
由于可以随意移动,所以可以向他获取行计数
if(cur.moveToFirst() == false)
{
//no rows empty
return;
}
//the cursor is already point to the first now
//let's access a few colums
int nameColumnIndex = cur.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY);
string name = cur.getString(nameColumnIndex);
//let's now see how we can loop through a cursor
while(cur.moveToFirst())
{
//cursor moved successfully
//accesfield
}
上述代码 在第一行的时候已经将游标放在了第一行之前。为了将游标放在第一行之前,我们对游标进行了moveToFirst()方法。如果游标为空,此方法为false。然后使用moveToNext()方法反复导航该游标。
为了帮助理解游标的位置,Android提供了一下的方法。
isBeforeFirst()
isAfterLast()
isClosed()
使用where子句
ContentProvider提供了两种方法来使用where子句
通过URI
通过string子句与一组可替换的字符串数组参数集合
我们通过URI来传递Where子句
Activity someActivtiy;
//..initialize the Activity
string noteUri = "content://com.google.provider.NotePad/note/23";
Cursor managedCursor = someActivtiy.managedQuery(noteUri,
projection, // which colums to return
null, //where clause
null); // Order-By clause;
我们将managedQuery方法的where子句参数保留为null。应为在本例中,我们假设笔记提供的程序非常的智能,能够判断我们想要的图书id,此id嵌入在URI本身。从某种意义上来说,我们将URI用做了传递where子句的工具。
使用显式的where子句
我们可以看到Activity中使用managedQuery方法。下面是该方法的prototype
public final Cursor managedQuery(Uri uri,
String[], projection
String selection,
String[] selectionArgs,
String sortOrder)
请注意名为selection的参数,他的类型为String。这个选择字符串表示一个过滤器(在本质上是一个where子句),他以SQL WHERE子句(不包含WHERE本身)的格式申明要返回的行。传递null将返回的给定URI的所有行。在选择字符串中可以包含?,它将被替换为selectionArg中的值,并按在选择列表中给出的列顺序显示。这些值将作为String绑定