2011-02-15 47 views
9

这是一个有趣的问题,我感到震惊的问题在互联网上没有被更多地询问。 Android的CursorAdapter非常有用,一旦你启动并运行ContentProvider并学习如何使用它,但由于需要将_id字段作为其查询的一部分(在没有它的情况下抛出错误),它是有限的。原因如下:Android的SimpleCursorAdapter使用DISTINCT查询

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

这里,我想对于第一微调查询:

SELECT DISTINCT category FROM table; 

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

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

回答

6

这是我结束了与查询:

SELECT _id, category FROM table_name GROUP BY category; 

我使用SQLiteDatabase对象上的rawQuery()函数来执行此操作。 “GROUP BY”是获得正确结果的关键,所以感谢用户Sagar指引我朝着正确的方向。

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

谢谢大家!

4

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

这增加了您可以更改类别表中的类别的优势,并且它将显示在该类别的所有条目中。

+0

哦,这看起来像优秀的数据库设计我!为了让我的内容提供者尽可能简单,我被告知要尽量减少表的数量,否则我会按照你的建议去做。感谢您添加此! – SilithCrowe 2011-02-15 17:11:44

+0

您的内容提供者可以使用多表查询来处理提供给它并从其返回的行中的类别名称。看看SQL“join”指令。 – 2011-02-17 08:13:40

3
SELECT DISTINCT category,_id FROM table GROUP BY category; 

认为这应该给你你在找什么。从这个结果将是类别,并为该类别的第一个_id。您可以忽略第二列(_id)。

0

您可以指定你的SELECT语句的_id字段别名,这只是一个恒定值,例如:

SELECT DISTINCT 0 _id, category FROM table;

0

更重要的是,我通过使用解决了这个问题:

SELECT DISTINCT category AS _id FROM table 

现在,你有一个名为_id的列其中有你在想什么