У меня есть таблица базы данных SQLite, и я хотел бы объединить два столбца и обновить третий столбец в той же базе данных, чтобы объединенная строка оставила пробел между ними. у меня есть общий синтаксис, но я просто не могу заставить его работать. Вот два утверждения, которые у меня есть. Кто-нибудь может указать мне, пожалуйста, в сторону правильного синтаксиса. Большое спасибо
database.update (ResturantEntry.TABLE_NAME, SET ResturantEntry.COLUMN_NAME_LOCATION = CONCAT(ResturantEntry.COLUMN_NAME, ' ', ResturantEntry.COLUMN_LOCATION));
второе заявление
database.update (ResturantEntry.TABLE_NAME, SET ResturantEntry.COLUMN_NAME_LOCATION = ResturantEntry.COLUMN_NAME + ' ' + ResturantEntry.COLUMN_LOCATION);
Вы не можете использовать метод SQLiteDatabase Обновить, если сначала не извлекли данные и не объединили их (из-за того, как метод защищает от SQL-инъекции (значение заключено в одинарные кавычки)). Однако вы можете сделать это исключительно через SQL, используя что-то вроде следующего: -
String updtsql = "UPDATE " + TABLE_NAME + " SET " + COLUMN_NAME_LOCATION + " = " + COLUMN_NAME + "||" + COLUMN_LOCATION + ";";
database.execSQL(updtsql);
||
- оператор конкатенации SQL.Но почему? (риторический) Вы вводите дублирование данных, поскольку в этом нет необходимости, поскольку вы можете легко извлечь объединенные данные.
например
Вы можете извлечь ArrayList из всех столбцов COLUMN_NAME_LOCATION (то есть со столбцом, содержащим объединенные данные), используя: -
public ArrayList<String> getNameLocationV1() {
ArrayList<String> rv = new ArrayList<>();
String[] columns = new String[]{COLUMN_NAME_LOCATION};
Cursor csr = database.query(TABLE_NAME,columns,null,null,null,null,null);
while (csr.moveToNext()) {
rv.add(csr.getString(csr.getColumnIndex(COLUMN_NAME_LOCATION)));
}
csr.close();
return rv;
}
Однако, несколько иначе, извлекает точно такие же данные, но без затрат на дополнительный столбец (т.е. для таблицы нужны только COLUMN_NAME и COLUMN_LOCATION): -
public ArrayList<String> getNameLocationV2() {
ArrayList<String> rv = new ArrayList<>();
String concatColumnName = COLUMN_NAME + COLUMN_LOCATION;
String[] columns = new String[]{COLUMN_NAME + "||"+COLUMN_LOCATION+" AS " + concatColumnName};
Cursor csr = database.query(TABLE_NAME,columns,null,null,null,null,null);
while (csr.moveToNext()) {
rv.add(csr.getString(csr.getColumnIndex(concatColumnName)));
}
csr.close();
return rv;
}
String concatColumnName = COLUMN_NAME + COLUMN_LOCATION;
(для этого можно использовать COLUMN_NAME_LOCATION)@ MikeT., Спасибо за очень подробные ответы, наводящие на размышления и различные варианты, а также за то, что указали мне правильное направление для наиболее оптимального решения. Я пробовал первое решение, и оно работает, однако я ищу улучшенные предложения, о которых вы упомянули. очень признателен.
Я буду использовать возможность извлечения точно таких же данных, но без затрат на дополнительный столбец, поскольку объединенные данные должны использоваться в отчете о просмотре списка, и, как вы упомянули, я могу объединить в рамках действия Listview, а затем заполнить свой список
Возможный дубликат Android Sqlite concat два столбца