BaseColumns在Android中有什么用途?

47

BaseColumns 在 Android 中实现一个类有什么用途?

4个回答

66

BaseColumns 接口提供了非常常见的 _ID_COUNT 列的名称。

使用常用名称使得 Android 平台(以及开发者)可以以统一的方式处理任何数据项,而不管其整体结构(即其他非 ID 列)。在接口/类中定义常用字符串的常量避免了代码中的重复和拼写错误。

CursorAdapterContentProvider 的实现以及其他需要将 Cursor 移交给 Android 平台进行处理的地方,都要求使用名为 _id(常量值为 BaseColumns._ID)的列。例如,ListView 的适配器会使用 _ID 列,在 OnItemClickListener.onItemClick() 中返回被点击列表项的唯一 ID,而无需每次都显式指定您的 ID 列。

是否要实现只包含常量的接口或使用完整名称(即 BaseColumns._ID)引用它们,是个人品味问题。我个人更喜欢后者,因为它更明显地表明了 _ID 是从哪里来的,而前者则感觉像滥用继承。


1
你仍然需要在SELECT查询中获取ID列,BaseColumns._ID仅定义了该ID列的名称 - Philipp Reichart
3
BaseColumns._ID 的值,即字符串 "_id"就是主 ID 列的名称;如果您想在 CusorAdapterContentProviderListView 等中使用,主 ID 列不能有其他任何名称。 - Philipp Reichart
我想到了一个可能的解决方案,即在每个表中不要使用名为“BaseColumns._ID”的列,而是为每个SQL SELECT语句创建一个名为此名称的列别名,以供CursorAdapter等使用。从数据库结构的角度来看,具有不同含义(语义)的相同列名不是一个好的模式。例如,在包括“用户”表在内的每个表中使用“UserID”表示“用户ID”的含义会更清晰明了... - yvolk
5
好的,但是"_COUNT"是什么意思,是指“目录中行数的计数”吗? - Maarten
2
@Maarten:“每个提供程序还可以报告返回的记录数作为_COUNT列;其值对所有行都相同。”来自“查询返回什么”的部分,网址为http://www.linuxtopia.org/online_books/android/devguide/guide/topics/providers/content-providers.html。 - Philipp Reichart
显示剩余4条评论

34

这是一个简单的界面,它添加了两个字段:

public interface BaseColumns
{
    /**
     * The unique ID for a row.
     * <P>Type: INTEGER (long)</P>
     */
    public static final String _ID = "_id";

    /**
     * The count of rows in a directory.
     * <P>Type: INTEGER</P>
     */
    public static final String _COUNT = "_count";
}

Android内部使用的SQLite数据库带有一个自动递增并可作为主键的_id列,这也可以与ContentProviders很好地映射。


1
BaseColumn接口仅提供列名_ID和_COUNT。在构建表格时,您仍然需要指定使用它们的列。例如,要使用列名_ID创建列,您可以执行以下操作:
public static final String CREATE_TABLE =
    "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ("
    + _ID + " INTEGER PRIMARY KEY, "
    + USERNAME + " TEXT NOT NULL, "
    + PASSWORD + " TEXT NOT NULL, "
    + EMAIL + " TEXT NOT NULL UNIQUE)";

0

这是一个界面,看起来像这样

public interface BaseColumns
{

    public static final String _ID = "_id";


    public static final String _COUNT = "_count";
}

它包含了在SQL Lite数据库中用于自增的常量,例如id和count。

我们也可以创建自己的id常量而不使用这个特定的接口。但是像cursor adaptor这样的函数需要确切的常量,如“_id”,因此最好使用提供的接口!

希望这能帮助你!:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接