12.1.6. 获取数据类型

优质
小牛编辑
131浏览
2023-12-01

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; //

}

  1. getType()使用辅助方法getId()判断URI中是否包含ID部分。如果得到负值,表示URI中不存在ID,因此返回vnd.android.cursor.dir/vnd.marakana.yamba.mstatus作为MIME类型。否则返回vnd.android.cursor.item/vnd.marakana.yamba.status。我们先前已经定义了这些常量。
  2. 为得到ID,获取URI的最后一个部分。
  3. 如果最后一个部分非空,则尝试转换为长整型并返回它。
  4. 最后一个部分可能不是数字,因此类型转换可能会失败。
  5. 返回-1表示URI中不含有合法的ID。