Android - сортировка вызовов по кешированному имени, если существует (использование ifnull в sqlite)

Я хотел бы отсортировать журналы вызовов по кешированному имени. Кэшированное имя может быть нулевым. Так что в случае нулевого кэшированного имени, я хотел бы иметь номер телефона для псевдонима.

в sqlite есть функция ifnull(). все детали

Я попробую:

String[] projections = new String[] { Calls._ID, Calls.NUMBER, Calls.DATE, Calls.TYPE, Calls.DURATION, "ifnull("+Calls.CACHED_NAME+","+Calls.NUMBER+") as display_name" };

Cursor cursor_call = ctx.getContentResolver().query(URI_CALL_LOGS,
                    projections,
                    null,
                    null,
                    null);

Но у меня есть ошибка с использованием ifnull и я не могу найти образец этой функции.

java.lang.IllegalArgumentException: недопустимый столбец ifnull (имя, номер) в качестве display_name

1 ответ

Решение

Благодаря тому, как вы создаете запрос, такие вещи, как скобки, автоматически экранируются, чтобы предотвратить атаки с использованием SQL-инъекций.

В ситуациях, когда у вас есть прямой доступ к необработанной БД (не через contentProvider), вы можете использовать SQLiteDatabase.rawQuery, например, так:

myDB.rawquery ("выберите * из a, b, где a.id=b.someid", null);

Но в этом случае похоже, что вы хотите получить доступ к базе данных call_log приложения контакта, что вы можете сделать только через предоставленный ContentResolver. Поскольку он специально предназначен для того, чтобы вы могли отправлять значения, а не команды SQL в качестве переменных, ifnull(...) не будет работать, и вам придется выбирать между именем и номером, используя логику, когда вы извлекаете данные из курсор

Другие вопросы по тегам