2013-03-02 3 views
0

Мой курсор возвращается записи в два раза, даже если я установить отчетливую к истинным:отображения различных записей SQLITE андроид

возвратного myDataBase.query (правда, DB_TABLE, новый String [] { " ROWID как _id", KEY_CONDITIONS }, builder.toString(), признаки, null, null, null, null);

FYI,

public Cursor getData(String[] symptoms) { 
    String where = KEY_SYMPTOMS + "= ?"; 
    String orStr = " OR "; 

    StringBuilder builder = new StringBuilder(where); 
    for(int i = 1; i < symptoms.length; i++) 
     builder.append(orStr).append(where); 

    return myDataBase.query(true, DB_TABLE, new String[] 
      {"rowid as _id", KEY_CONDITIONS}, builder.toString(), symptoms, null, null, null, null); 

} 

Или я пытался изменить к rawQuery

return myDataBase.rawQuery("SELECT DISTINCT " + KEY_CONDITIONS + " FROM " 
    + DB_TABLE + " " + builder.toString() + symptoms.toString(), null); 

Мой LogCat говорит:

03-02 22:57:02.634: E/AndroidRuntime(333): FATAL EXCEPTION: main 
    03-02 22:57:02.634: E/AndroidRuntime(333): android.database.sqlite.SQLiteException: near "=": syntax error: , while compiling: SELECT DISTINCT conditions FROM tblSymptoms symptoms= ? OR symptoms= ?[Ljava.lang.String;@405550f8 

Пожалуйста, помогите мне определить, что, кажется, отсутствует здесь. Любая помощь действительно ценится.

enter image description here

ответ

7

Решение
Вы хотите DISTINCT условия, но Android требует _id столбца, который является проблемой, потому что вы не можете смешивать и сочетать: SELECT _id, DISTINCT condition... . Однако вы можете использовать GROUP BY пункт вместо:

return myDataBase.query(DB_TABLE, new String[] {"rowid as _id", KEY_CONDITIONS}, 
     builder.toString(), symptoms, KEY_CONDITIONS, null, null); 

Пояснения
Этот запрос:

return myDataBase.rawQuery("SELECT DISTINCT " + KEY_CONDITIONS + " FROM " 
    + DB_TABLE + " " + builder.toString() + symptoms.toString(), null); 

Не удалось, потому что вы передаете String[] symptoms в неверном параметре, попробуйте:

return myDataBase.rawQuery("SELECT DISTINCT " + KEY_CONDITIONS + " FROM " 
    + DB_TABLE + " " + builder.toString(), symptoms); 

Этот запрос:

return myDataBase.query(true, DB_TABLE, new String[] {"rowid as _id", KEY_CONDITIONS}, builder.toString(), symptoms, null, null, null, null); 

Не удалось, потому что DISTINCT смотрит на как Ид и состояния колонн. Это эквивалентно: SELECT DISTINCT(_id, conditions) ... Вы, очевидно, хотят только отличные условия ...

+0

Да, очевидно, я хочу отличные условия. Пожалуйста, см. Мое сообщение о обновлении моей таблицы записей –

+0

Я попытался выполнить этот запрос в браузере SQLite: выберите условия DISTINCT FROM tblsptptoms, где симптомы = «Боль в груди» ИЛИ симптомы = «Головокружение». Интересно, почему он не отображается в Android? –

+0

Какой запрос вы используете? Вы попробовали 'rawQuery()' выше? Ошибка 'query()', потому что это эквивалент SQL: 'Выберите DISTINCT (rowid, условия) FROM tblsptptoms где ...'. Обратите внимание на разницу? – Sam

0

у вас есть два общих второй вариант выполнения этой задачи использование строки запроса ** и ** использовать DISTINCT ключевое слово

для использования запрос строки вы можете напрямую использовать функцию mr.Сэм и для использования DISTINCT ключевого слова можно использовать

public Cursor query (boolean distinct, String table, String[] columns, 
       String selection, String[] selectionArgs, String groupBy, 
       String having, String orderBy, String limit) 

потому stucher запроса retuns это:

query(false, table, columns, selection, selectionArgs, groupBy, 
      having, orderBy, null /* limit */); 

в этом коде первого аргументом является для DISTINCT так представить его как true. так что ваш query понравится этот

Cursor cursor = db.query(true, YOUR_TABLE_NAME, new String[] { COLUMN1 ,COLUMN2, COLUMN_NAME_3 }, null, null, COLUMN2, null, null, null); 

В основном DISTINCT ключевое слово возвращает имя столбца только один раз, если он apperase более раз.