какой оператор sqlite может выдать результат для указания повторяющихся записей?Android

StackOverflow https://stackoverflow.com/questions/1634752

Вопрос

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

Вот хороший инструмент для вычисления расстояний между широтными и продольными точками на Земле:

http://jan.ucc.nau.edu /~cvm/latlongdist.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top