2012-03-21 2 views
1

У меня проблема с курсором и SimpleCursorAdapter.SimpleCursorAdapter не работает из-за отсутствия _id

Что я хочу сделать:
У меня есть база данных с 3 полями
_id | nickName | somethingelse

Я хочу четко определить все имена nickNames и предоставить их в AutoCompleteTextView.

Проблема:
При выполнении запроса (смотри ниже) я не выбрать _id-поле. Вот почему я получаю сообщение об ошибке при попытке создать SimpleCursorAdapter, потому что в курсоре нет поля «_id». Но если я выберу «_id» в запросе, никнеймы в курсоре больше не будут ущемлены! Кроме того, курсор не может быть изменен до моих знаний или не так ли?

Так что я понял, что обходное решение работает, но довольно плохой стиль программирования, потому что я делаю двойную работу ... Я просто помещаю те же данные в другой контейнер, а затем использую его. Разве нет прямого пути для этого? На самом деле это простая задача ... должен быть способ сделать это, и я не вижу этого.

Вот код:

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

вы пробовали:

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

Я не совсем уверен, если это работает в SQLite.

+0

Спасибо, это действительно решает проблему _id. Но теперь я заметил, что мне нужно реализовать функцию фильтрации AutoCompleteTextView, потому что SimpleCursorAdapter не может этого сделать сам по себе. Так что я думаю, что в любом случае я буду придерживаться обходного решения. Но спасибо за подсказку! Кстати: вот способ изменить отображение курсора: [Группы Google] (http://groups.google.com/group/android-developers/browse_thread/thread/796342d2a30c0c0b?pli=1) – Michi

0

Вы можете написать этот способ также

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

дать первое поле personid в качестве псевдонима (переименование) _id

+0

Я не знаю «Не понимаю, что вы имеете в виду,« дайте первому полевому лицу как псевдоним (переименовать) _id »... Как это мне поможет? Как этот ответ отличается от flo? – Michi

+0

, если вы используете существующую базу данных, и в этой базе данных у вас есть фиксированное имя столбца, вы можете использовать одно и то же имя, используя псевдоним _id.no необходимо изменить имя столбца для каждой таблицы в базе данных. – amy

+1

А теперь я понимаю, что вы имеете в виду. Вы не совсем поняли проблему. В этой базе данных уже есть поле _id. Но я не хотел выбирать этот столбец. Но андроид требует от меня выбрать этот столбец, потому что иначе api не сможет обработать его должным образом. – Michi

Смежные вопросы