SQLite получить идентификаторы и имена, где имя нравится - PullRequest
0 голосов
/ 23 октября 2018
id|  name   |...
--------------
1 |Emmi blaa|..

2 |Emmi haa |..

3 |Emmi naa |..

У меня есть база данных SQLite с таблицей именованных контактов, которые содержат идентификатор, имя и другую информацию.Я пытаюсь получить имя и идентификатор с именем переменной, которую я даю в 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";

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

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

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

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")))); (также рекомендуется, чтобы имена таблиц и столбцов определялись как константы, а затем использовались эти константы вместо жесткого кодирования имен столбцов / таблиц).

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

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

0 голосов
/ 23 октября 2018

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

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

Из документов :

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

...