id|  name   |...
--------------
1 |Emmi blaa|..

2 |Emmi haa |..

3 |Emmi naa |..

У меня есть база данных SQLite с таблицей с именем contacts, которая содержит идентификатор, имя и другую информацию. Я пытаюсь получить имя и идентификатор с помощью переменной имени, которую я даю в EditText.

String query = "SELECT name, id FROM contacts WHERE name LIKE \"%" + name + "%\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursorC = db.rawQuery(query, null);
while (cursorC.moveToNext()) {
   System.out.println(cursorC.getString(0));
}

С помощью приведенного выше кода я могу получить только имена, но не идентификатор, поэтому я попробовал GROUP_CONCAT

String query = "SELECT id, GROUP_CONCAT(name) FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id";

Теперь я получаю только идентификаторы. Как, например, получить как идентификатор, так и имя, если переменная имени будет «мм»?

-1
Mizkei 23 Окт 2018 в 22:06

2 ответа

Лучший ответ

Я считаю, что ваша проблема не в том, что первый запрос не получил идентификатор, а в том, что вы не извлекали столбец идентификатора из курсора.

Следующее будет работать: -

String query = "SELECT name, id FROM contacts WHERE name LIKE \"%" + name + "%\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursorC = db.rawQuery(query, null);
while (cursorC.moveToNext()) {
   System.out.println(cursorC.getString(0) + " : " + cursorC.getString(1));
}

Однако в идеале вы должны использовать метод Cursor getLong для получения идентификаторов, поскольку id может быть таким большим, как 64-битное целое число со знаком. Так что System.out.println(cursorC.getString(0) + " : " + String.valueOf(cursorC.getLong(1))); будет лучше.

Кроме того, улучшением было бы использование метода курсора getColumnIndex (the_column_name) . Это более гибко, поскольку индекс столбца определяется в соответствии с именем столбца. Таким образом, рекомендуется использовать System.out.println(cursorC.getString(cursorC.getColumnIndex("name")) + " : " + String.valueOf(cursorC.getLong(cursorC.getColumnIndex("id")))); (также рекомендуется, чтобы имена таблиц и столбцов определялись как константы, а затем использовались эти константы, а не жестко кодировать имена столбцов / таблиц).

  • < EM> например . если запрос был изменен на SELECT id, name FROM contacts WHERE name LIKE \"%" + name + "%\"", то использование жестко заданных смещений 0 и 1 изменило бы результаты. Однако результаты не изменились бы при использовании getColumnIndex.

  • Если вы хотите использовать второй запрос String query = "SELECT id, GROUP_CONCAT(name) FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id";, обратите внимание, что имена столбцов в курсоре - id и GROUP_CONCAT (name) , обычно будет указан псевдоним к имени с помощью ключевого слова AS . например String query = "SELECT id, GROUP_CONCAT(name) AS all_names FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id"; Имя столбца в результирующем курсоре будет all_names .

1
MikeT 23 Окт 2018 в 19:35

С вашим первым запросом все в порядке. Вы получаете только имя, потому что получаете только первый столбец результата: System.out.println(cursorC.getString(0));

Чтобы получить другие столбцы, используйте аналогичные методы cursor.getString() или cursor.getInteger() с параметром 1. Или даже cursor.getInt(cursor.getColumnIndex("id"))

Из документации:

Для каждой строки вы можете прочитать значение столбца, вызвав один из методов получения курсора, например getString () или getLong (). Для каждого из методов get вы должны передать позицию индекса нужного столбца, которую вы можете получить, вызвав getColumnIndex () или getColumnIndexOrThrow ().

1
Sergey Glotov 23 Окт 2018 в 19:20
52956237