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

时间:2011-07-22 15:46:24

标签: android android-contentprovider

我正在浏览Google IOSched应用的源代码,并注意到以下代码段作为其内容提供商实施的一部分:

public static class Blocks implements BlocksColumns, BaseColumns

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

我有两个问题:

  1. 实施BaseColumns有哪些优点/缺点,而不是直接在类中使用私有字段_ID

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

2 个答案:

答案 0 :(得分:23)

根据Android Developer Guide

  

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

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

  

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

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

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

答案 1 :(得分:-3)

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