11

这是一个有趣的问题,我很震惊在互联网上没有被更多地问到。一旦您启动并运行 ContentProvider 并学习如何使用它,Android 的 CursorAdapters 就非常有用,但由于要求将 _id 字段作为查询的一部分(没有它会引发错误),因此它们受到限制。原因如下:

我的具体问题是我有两个微调器:一个微调器应包含数据库中唯一的“类别”名称,另一个应填充所选“类别”中的所有数据库条目(类别为列名,此处)。这似乎是许多程序可能使用的非常简单的设置,不是吗?尝试实现第一个微调器是我遇到问题的地方。

这是我想要的第一个微调器的查询:

SELECT DISTINCT category FROM table;

进行此查询会在 CursorAdapter 上引发错误,因为 _id 列是查询的一部分。将 _id 列添加到投影中自然会返回表的每一行,因为您现在也要求不同的 id,并且每个 id 都是不同的(根据定义)。显然,我宁愿每个类别名称只看到一个条目。

我已经实现了一个变通方法,即简单地进行上面的查询,然后将结果复制到 ArrayAdapter 中。我写这篇文章的原因是想看看这个奇怪的小问题是否有更优雅的解决方案,并开始讨论我可以做得更好的地方。非常欢迎替代实施建议,例如使用不同类型的控件或适配器。

4

5 回答 5

6

这是我最终得到的查询:

SELECT _id, category FROM table_name GROUP BY category;

我在 SQLiteDatabase 对象上使用 rawQuery() 函数来执行此操作。“GROUP BY”部分是获得正确结果的关键,因此感谢用户 Sagar 为我指明了正确的方向。

也请考虑用户 Al Sutton 对这个问题的回答,因为它可能是解决这个问题的更优雅的解决方案。

感谢大家!

于 2011-03-15T18:47:31.117 回答
4

我建议有一个单独的表,其中只有 _id 和类别,其中每个唯一类别包含一行。然后,您的数据行可以将其类别字段替换为类别表中的 _id。

这具有额外的优势,您可以更改类别表中的类别,它将显示在该类别的所有条目中。

于 2011-02-15T14:19:42.017 回答
3
SELECT DISTINCT category,_id FROM table GROUP BY category;

认为这应该给你你正在寻找的东西。此结果将是类别,以及该类别的第一个 _id。您可以忽略第二列 (_id)。

于 2011-02-15T14:22:09.133 回答
0

您可以在 select 语句中指定一个 _id 字段别名,该别名只是一个常量值,例如:

SELECT DISTINCT 0 _id, category FROM table;

于 2011-02-15T17:31:40.370 回答
0

更好的是,我使用以下方法解决了这个问题:

SELECT DISTINCT category AS _id FROM table

现在,您有一个名为 _id 的列,其中包含您想要的内容

于 2014-02-06T23:29:15.637 回答