由于缺少_id,SimpleCursorAdapter将无法工作

时间:2012-03-21 16:37:45

标签: android cursor simplecursoradapter

我遇到了Cursor和SimpleCursorAdapter的问题。

我想要完成的任务:
我有一个包含3个字段的数据库
_id | nickName | somethingelse

我想清楚地选择所有nickNames并在AutoCompleteTextView中提供它们。

问题:
在进行查询时(见下文),我不选择_id-field。这就是我在尝试创建SimpleCursorAdapter时出错的原因,因为在游标中没有字段" _id"。 但如果我选择" _id"在查询中,光标中的nickNames不再是命运!另外,根据我的知识,Cursor是不可修改的,或者是吗?

所以我想出了一个有效的解决方法,但编程风格非常糟糕,因为我做了两倍的工作......我只是将相同的数据放入另一个容器然后使用它。难道没有直接的方法吗?这实际上是一项简单的任务......必须有办法做到这一点,我不会看到它。

以下是代码:

protected void onPrepareDialog(int id, final Dialog dialog)
{
   switch(id)
   {
      case R.layout.database_feed:
         /*get all distinct names in the Database */
         Cursor cursor2 = mDatabase.rawQuery("SELECT DISTINCT nickName FROM highscore_table "+
               "ORDER BY nickName COLLATE NOCASE", null);
         /* I didn't find a simple way to set cursor2 in a 
          * CursorAdapter for the AutoCompleteTextView.
          * this was my first try (does not work): */
         /*((AutoCompleteTextView) dialog.findViewById(R.id.actvName)).setAdapter(
               new SimpleCursorAdapter(this,android.R.layout.simple_dropdown_item_1line, 
                     cursor2, new String[] { "nickName" },
                     new int[] { android.R.layout.simple_dropdown_item_1line } )
         ); */

         /*this is my workaround ... it works but it's horrible*/
         LinkedList<String> llsNames = new LinkedList<String>();
         for(cursor2.moveToFirst(); !cursor2.isAfterLast(); cursor2.moveToNext())
         {
            llsNames.addLast(cursor2.getString(0));
         }
         ((AutoCompleteTextView) dialog.findViewById(R.id.actvName)).setAdapter(new ArrayAdapter<String>(
               this, android.R.layout.simple_dropdown_item_1line, llsNames
         ));
         break;
      default:
         break;
   }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

你试过了吗?

SELECT _id, nickName FROM highscore_table GROUP BY nickName ORDER BY nickName COLLATE NOCASE

我不太确定这是否适用于SQLite。

答案 1 :(得分:0)

你也可以这样写

SELECT  personid _id, nickName FROM highscore_table GROUP BY nickName ORDER BY nickName COLLATE NOCASE 

将第一个字段personid作为别名(重命名)_id