какой оператор sqlite может выдать результат для указания повторяющихся записей?Android
-
06-07-2019 - |
Вопрос
Для моего приложения я пытаюсь добавить записи, не имея дублирующейся записи, и, если есть дубликат, уведомить пользователя и попросить его повторить попытку.Используя SQLite, о котором я знаю очень-очень мало, я попробовал эти два способа и хочу знать, какой из них лучше, эффективнее или лучший способ его разработки?
Первый способ:
db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE +
"(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rating +
" WHERE NOT EXISTS (SELECT 1 FROM " + DatabaseHelper.DATABASE_TABLE +
" WHERE LATITUDE = " + latitude + " AND LONGITUDE = " + longitude + ")");
Второй способ:
long id = -1;
try {
id = db.compileStatement(
"SELECT COUNT(*) FROM " + DatabaseHelper.DATABASE_TABLE
+ " WHERE LATITUDE = " + latitude
+ " AND LONGITUDE = " + longitude)
.simpleQueryForLong();
} catch (NullPointerException e) {
return -1;
}
return id;
Первый способ, либо вставляющий, либо игнорирующий значения, я проверяю таким образом, сохраняя количество строк в переменной перед вызовом, вызывая эту функцию, а затем проверяя ее результаты.Если результаты не выше, чем были до вызова, вставка была проигнорирована, отправьте пользователю сообщение "значения существуют".(Очень неаккуратно, я знаю, но отчаянные времена требуют отчаянных мер)
Второй способ возвращает фактическое количество строк, которые соответствуют числам, которые я хочу сохранить, если возвращенное число больше 1, запрашивает у пользователя сообщение "значения существуют".
Я ходил туда-сюда, пробуя разные способы, но я не знаю, как настроить SQLite на наличие УНИКАЛЬНЫХ пар, что, как мне сказали, было бы самым простым.Если кто-нибудь может исправить любой из этих способов и / или прокомментировать их, мы были бы очень признательны.
Спасибо
Решение 3
Я решил использовать свой второй подход (см. выше).
Причина в том, что с момента создания UNIQUE INDEX
похоже, у меня это не сработало, и оказалось трудной задачей для меня, независимо от того, было ли это результатом моего или SQLite конца.
Его цель нетривиальна, подход может быть элементарным, но он делает то, что мне нужно.
Я надеюсь, что ответы, оставленные здесь, повлияют на людей, столкнувшихся с подобной ситуацией, и желаю им удачи в этом больше, чем мне.
Другие советы
Вот чего, как я понимаю, вы хотите:Иметь таблицу Database_Table (не самое описательное название, если можно так выразиться), которая никогда не позволит вводить одну и ту же пару широты и долготы для двух строк.
Если это правильно, вы хотите объявить либо ПЕРВИЧНЫЙ, либо УНИКАЛЬНЫЙ КЛЮЧ, который включает столбцы latitude и longitude.Если вы сделаете это, то любая попытка ВСТАВИТЬ одну и ту же пару вызовет исключение, которое вы можете перехватить и тем самым уведомить пользователя.Используя этот метод, вам не нужно будет использовать предложение WHERE NOT EXISTS (...) в вашем запросе, просто выполните обычную вставку и позвольте SQLite предупредить вас о нарушении вашего ограничения уникальности.
Если ваша таблица уже существует, ключ проще всего добавить с помощью команды SQL СОЗДАТЬ ИНДЕКС.Поскольку у вас может быть только один ПЕРВИЧНЫЙ КЛЮЧ в любой таблице, если у вас уже есть ПЕРВИЧНЫЙ КЛЮЧ в таблице, вам нужно будет использовать УНИКАЛЬНЫЙ КЛЮЧ для этой цели.
Самая простая форма инструкции CREATE INDEX, которую вы бы использовали, это:
CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)
Мне кажется, что использование необработанных значений lat / long - не самый лучший способ проверить наличие дубликатов.Каждая возможная комбинация широты и длины с использованием формата GeoPoint 1E6 от Android занимает площадь менее пяти квадратных дюймов.Этот размер, конечно, отличается в зависимости от того, в какой точке Земли вы находитесь, но это довольно хорошее эмпирическое правило.Таким образом, вы должны, по крайней мере, округлить свою широту / длину до ближайших десяти, ста или тысячи в зависимости от размера предмета, который вы хотите измерить.
Прежде чем вы сохраните его в базе данных:
lat = (lat/1000)*1000;
lon = (lon/1000)*1000;
Вот хороший инструмент для вычисления расстояний между широтными и продольными точками на Земле: