Android的SimpleCursorAdapter使用DISTINCT进行查询

时间:2011-02-15 14:14:53

标签: android sqlite distinct simplecursoradapter

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

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

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

SELECT DISTINCT category FROM table;

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

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

5 个答案:

答案 0 :(得分:6)

以下是我最终的查询:

SELECT _id, category FROM table_name GROUP BY category;

我在SQLiteDatabase对象上使用了rawQuery()函数来实现它。 “GROUP BY”片段是获得正确结果的关键,所以感谢用户Sagar指出我正确的方向。

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

谢谢大家!

答案 1 :(得分:4)

我建议使用一个单独的表格,只需_id&其中的类别,每个唯一类别包含一行。然后,您的数据行可以使用类别表中的_id替换其类别字段。

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

答案 2 :(得分:3)

SELECT DISTINCT category,_id FROM table GROUP BY category;

认为这应该可以满足您的需求。此结果将是类别,并且是该类别的第一个_id。您可以忽略第二列(_id)。

答案 3 :(得分:0)

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

SELECT DISTINCT 0 _id, category FROM table;

答案 4 :(得分:0)

更好的是,我通过使用:

解决了这个问题
SELECT DISTINCT category AS _id FROM table

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