12.1.6. 获取数据类型
12.1.6.获取数据类型
ContentProvider必须能够给出数据的MIME类型。MIME类型是针对URI而言,表示单个条目和表示多个条目的URI的MIME类型就是不同的。在本章前面,我们曾定义了单个条目的MIME类型vnd.android.cursor.item/vnd.marakana.yamba.status,而多个条目的MIME类型是vnd.android.cursor.dir/vnd.marakana.yamba.status。便于他人获取相应的MIME类型,我们需要在ContentProvider类中实现一个getType()方法。
MIME类型的第一部分可以是vnd.android.cursor.item或者vnd.android.cursor.dir,前者表示单个条目,后者表示多个条目。MIME类型的第二部分与应用程序相关,在这里可以是vnd.marakana.yamba.status或者vnd.marakana.yamba.mstatus,由公司名或者应用程序名,以及内容类型组成。
前面提过URI的结尾可能会是数字。如果是,那这个数字就是某个记录的ID。如果不是,则表示URI指向多条记录。
下面的代码展示了getType()的实现,以及前面用过多次的辅助方法getId():
@Override
public String getType(Uri uri) {
return this.getId(uri) < 0 ? MULTIPLE_RECORDS_MIME_TYPE
: SINGLE_RECORD_MIME_TYPE; //
}
private long getId(Uri uri) {
String lastPathSegment = uri.getLastPathSegment(); //
if (lastPathSegment != null) {
try {
return Long.parseLong(lastPathSegment); //
} catch (NumberFormatException e) { //
// at least we tried
}
}
return -1; //
}
- getType()使用辅助方法getId()判断URI中是否包含ID部分。如果得到负值,表示URI中不存在ID,因此返回vnd.android.cursor.dir/vnd.marakana.yamba.mstatus作为MIME类型。否则返回vnd.android.cursor.item/vnd.marakana.yamba.status。我们先前已经定义了这些常量。
- 为得到ID,获取URI的最后一个部分。
- 如果最后一个部分非空,则尝试转换为长整型并返回它。
- 最后一个部分可能不是数字,因此类型转换可能会失败。
- 返回-1表示URI中不含有合法的ID。