为什么/我们应该在Android中使用Content Provider时实现BaseColumns?

Man*_*del 15 android android-contentprovider

我正在浏览Google IOSched App 的源代码,并注意到以下代码段作为其Content Provider实现的一部分:

public static class Blocks implements BlocksColumns, BaseColumns.

据我所知,BaseColumns只是两个常量的接口:_COUNT_ID.

我有两个问题:

  1. _ID与直接在类中拥有私有字段相比,实现BaseColumns有哪些优点/缺点?

  2. 常数的作用是_COUNT什么?

小智 23

根据Android开发者指南,

注意:提供者不需要拥有主键,并且如果存在主键,则不需要使用_ID作为主键的列名.但是,如果要将数据从提供程序绑定到ListView,则其中一个列名称必须为_ID.在显示查询结果部分中更详细地解释了此要求.

本指南继续解释为什么您需要提供独特价值的基础知识primary key,

表数据应始终具有"主键"列,提供程序将其维护为每行的唯一数值.您可以使用此值将行链接到其他表中的相关行(将其用作"外键").虽然您可以为此列使用任何名称,但使用BaseColumns._ID是最佳选择,因为将提供程序查询的结果链接到ListView需要其中一个检索到的列具有名称_ID. [强调我的]

按照您提供的顺序回答您的问题:

  1. 使用_ID色谱柱是多功能性的最佳实践.它不必显示,但作为主键(和外键!)非常有效,因为游标和查询是必需的.
    • 通过BaseColumns识别它会自动将此列标识为主键,唯一(显然),并指示它自动增量.
    • 据推测,实现BaseColumns比为私有字段键入这些属性更容易.
  2. _COUNT 只是目录中行数的计数. 如果正在删除并添加表的行,则没有理由相信项的_ID整数与添加它或其排序属性有关.换句话说,last_insert_rowid() 不等于 Count()._COUNT列只是提供了一种方法,用于显示查询返回的结果数,在该查询的每一行中.有关可视参考,请参阅linuxtopia.org


Nit*_*sal -3

没有真正的理由使用它......你可以完全忽略它并使用你自己的定义和_ID_COUNT如果你需要)......