这是一个有趣的问题,我很震惊,在互联网上没有经常被问到。一旦你启动并运行ContentProvider并学习如何使用它,Android的CursorAdapters非常有用,但是由于他们要求将_id字段作为查询的一部分而被限制(如果没有它就会抛出错误)。原因如下:
我的具体问题是我有两个微调器:一个微调器应该包含数据库中唯一的“类别”名称,另一个应该填充所选“类别”的所有数据库条目(类别是列名,在这里)。这似乎是一个非常简单的设置,许多程序可能会使用,不是吗?试图实现第一个微调器是我遇到问题的地方。
这是我想要第一个微调器的查询:
SELECT DISTINCT category FROM table;
使此查询在CursorAdapter上引发错误,因为_id列是查询的一部分。将_id列添加到投影自然会返回表的每一行,因为您现在也要求不同的id,并且每个id都是不同的(根据定义)。显然,我宁愿每个类别名称只看到一个条目。
我已经实现了一个解决方法,即简单地进行上面的查询,然后将结果复制到ArrayAdapter中。我这篇文章的理由是看看这个奇怪的小问题是否有一个更优雅的解决方案,并开始讨论我可以做得更好。非常欢迎使用其他实现建议,例如使用不同类型的控件或适配器。
这是我最终得到的查询:
SELECT _id, category FROM table_name GROUP BY category;
我在SQLiteDatabase对象上使用了rawQuery()函数来实现它。 “GROUP BY”片段是获得正确结果的关键,所以感谢用户Sagar指出我正确的方向。
请考虑用户Al Sutton对此问题的回答,因为它可能是解决此问题的更优雅的解决方案。
感谢大家!
我建议在一个单独的表中只包含_id和类别,每个唯一类别包含一行。然后,您的数据行可以使用类别表中的_id替换其类别字段。
这具有额外的优势,您可以更改类别表中的类别,它将显示在该类别的所有条目中。
这是我最终得到的查询:
SELECT _id, category FROM table_name GROUP BY category;
我在SQLiteDatabase对象上使用了rawQuery()函数来实现它。 “GROUP BY”片段是获得正确结果的关键,所以感谢用户Sagar指出我正确的方向。
请考虑用户Al Sutton对此问题的回答,因为它可能是解决此问题的更优雅的解决方案。
感谢大家!
我建议在一个单独的表中只包含_id和类别,每个唯一类别包含一行。然后,您的数据行可以使用类别表中的_id替换其类别字段。
这具有额外的优势,您可以更改类别表中的类别,它将显示在该类别的所有条目中。
SELECT DISTINCT category,_id FROM table GROUP BY category;
一世 认为 这应该会给你你想要的东西。此结果将是类别,并且是该类别的第一个_id。您可以忽略第二列(_id)。
您可以在select语句中指定一个只是常量值的_id字段别名,例如:
SELECT DISTINCT 0 _id, category FROM table;
更好的是,我使用以下方法解决了这个问题:
SELECT DISTINCT category AS _id FROM table
现在,您有一个名为_id的列,其中包含您想要的内容