#android #sqlite
#Android #sqlite
Вопрос:
У меня есть edittext, который позволяет пользователю вводить числа до 10.
Я хочу иметь возможность сохранять эти числа в базе данных SQLite в виде списка строк.
Позволяет ли SQL это сделать? Если да, то как?
Например, String [] list = {1020300303,1020303001,0102003020};
Ответ №1:
Вы можете это сделать, но вы будете нарушать правила нормализации.
Если вы сохраняете этот массив в виде одной строки (разделенной запятыми?), Вам придется проанализировать его, чтобы просмотреть отдельные значения. Не очень хорошая идея.
Нормализованная схема будет использовать отношение «один ко многим» между двумя таблицами. Один будет родительским, другой дочерним с одной строкой на значение и отношением первичного / внешнего ключа. Вы получите значения обратно, используя соединение.
Если вы так настроены на это, вам придется объединить все строки в массиве в одну, с некоторым разделителем между ними, который, вы уверены, никогда не появится ни в одной из строк, которые вы объединяете. Если у вас есть строка с одним разделителем, ВСТАВЬТЕ ее в столбец типа String в таблице в вашей базе данных SQLite.
Поскольку вы настаиваете на просмотре некоторого кода, вот как это может выглядеть в Java:
String [] list = { "1020300303", "1020303001", "0102003020" };
StringBuilder concatenatedList = new StringBuilder();
for (String s : list) {
concatenatedList.append(s).append('~'); // Any delimiter will do.
}
PreparedStatement ps = connection.prepareStatement("INSERT INTO MySQLiteTable(stringColumnName) VALUES(?)";
ps.setString(1, concatenatedList.toString());
int numRowsAffected = ps.executeUpdate();
Я бы так не написал — ни очистки, ни обработки ошибок, ни хорошей инкапсуляции. Но он показывает, куда вы хотите перейти.
Комментарии:
1. Не могли бы вы подробнее объяснить с помощью кода? А что, если бы у меня было 10 столбцов, таких как number 1, number2 и т. Д. и извлекает такие числа? Поскольку пользователь ограничен 10 номерами? Или это было бы чрезмерным уничтожением? Я подумал, что описанный выше способ будет наиболее эффективным.
2. Или, может быть, есть другой способ, которым я могу это сделать, кроме SQLite
3. Что, если их меньше десяти? Вам когда-нибудь было бы интересно узнать, сколько чисел они ввели? Простой запрос COUNT подскажет вам это. Ваш способ будет означать запрос к строке, разделение ее на массив и получение длины массива. Что, если они удалят только одно значение? Ваш способ — это b!tch; нормализованный подход просто удаляет строку из дочернего элемента, ГДЕ ЗНАЧЕНИЕ = (удаленное значение). Мой совет применим ко всем реляционным базам данных, а не только к SQLite.
4. Итак, хорошо…. Все, что я хочу сделать, это поместить строку [] в базу данных .. а затем вытащить список, когда это необходимо..
5. Итак, продолжайте … что вас останавливает? Объедините строки в одну, с некоторым разделителем между ними, и ВСТАВЬТЕ. Это твои похороны.