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