【问题标题】:Why/Should we implement BaseColumns when using a Content Provider in Android?为什么/我们应该在 Android 中使用 Content Provider 时实现 BaseColumns?
【发布时间】:2011-10-11 04:13:53
【问题描述】:

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

public static class Blocks implements BlocksColumns, BaseColumns.

据我所知,BaseColumns 只是两个常量的接口:_COUNT 和 _ID。

我有两个问题:

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

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

【问题讨论】:

  • #1 对我来说似乎是一种反模式。我像常量类一样使用 BaseColumns,所以直接在我的代码中使用 BaseColumns._ID。

标签: android android-contentprovider


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据Android Developer Guide,

    注意:提供者不需要有主键,也不需要 需要使用 _ID 作为主键的列名,如果是 展示。但是,如果您想将数据从提供者绑定到 ListView,其中一个列名必须是_ID。这个要求是 在显示查询结果部分中进行了更详细的说明。

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

    表数据应始终具有提供程序的“主键”列 保持为每一行的唯一数值。你可以用这个 将该行链接到其他表中相关行的值(将其用作 “外键”)。尽管您可以为此列使用任何名称,但使用 BaseColumns._ID 是最好的选择,因为链接一个结果 对 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

    【讨论】:

    • 如果我有多个表并且表有主键比如note_table 有 note_id 和 book_table 有 book_id 我该如何使用 BaseColumns._ID 那里??
    • @VikasRathod 只需实现 BaseColumns 来设置架构,developer.android.com/training/basics/data-storage/…>。代替FeedEntry,为实现BaseColumns 的每个表创建一个新类。您有两个名为“ID”的字段不会有问题,因为一个实际上是“book_ID”,另一个是“note_ID”。每个表都有一个主键,但不一定有一个外键。
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 2011-12-15
    • 2011-04-22
    • 2011-05-16
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多