Создать уникальный индекс, не помогающий остановить дубликаты

У меня есть основная таблица базы данных с именем детали с тремя интересующими колонками -

_id | Name | BirthDate | xx | xx | xx | ...

Я создаю уникальный индекс на приведенной выше таблице со следующим утверждением:

CREATE UNIQUE INDEX _id ON Details (Name, BirthDate)

Цель вышеупомянутого состоит в том, чтобы остановить повторяющиеся записи в таблице, я не хочу, чтобы какое-либо имя и дата рождения были одинаковыми. (Хотя я не уверен, что это так, я попытался вставить новую запись с той же датой рождения и именем, но я обнаружил, что предыдущая существующая запись с такими же учетными данными была удалена и эта новая вставлена ​​в конце) - однако это было Не так, прежде чем я ввел следующее:

У меня есть отдельная таблица следующим образом и называется Уведомления:

| _id | NotificationFor | DateToNotify | IsExtraordinary | NotificationData | NotificationDateFor | TypeNotification | RadioType | FriendsName | PrimaryId |

Приведенные выше две таблицы сопоставлены: _id в таблице подробностей PrimaryId в таблице уведомлений.

Для каждой _id (записи) в таблице "Подробности" сгруппированы четыре записи, и все они вставляются в таблицу "Уведомления".

Теперь проблема в том, что я не хочу дублировать записи в любой из моих таблиц, поэтому я добавляю уникальный индекс в таблицу уведомлений следующим образом:

CREATE UNIQUE INDEX _id ON Notifications (NotificationFor, DateToNotify, IsExtraordinary,NotificationData,NotificationDateFor,TypeNotification,RadioType,FriendsName,PrimaryId);

Я получил следующую ошибку:

10-02 14:16:31.439: E/AndroidRuntime(31743): FATAL EXCEPTION: main
10-02 14:16:31.439: E/AndroidRuntime(31743): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx.xxx.xxx}: android.database.sqlite.SQLiteException: index _id already exists (code 1): , while compiling: CREATE UNIQUE INDEX _id ON Notifications (NotificationFor, DateToNotify, IsExtraordinary,NotificationData,NotificationDateFor,TypeNotification,RadioType,FriendsName,PrimaryId );

В моем DBAdapter я выполняю код следующим образом:

db.execSQL(uniqueDetails); 
db.execSQL(uniqueNotifications);

Я изменил запрос uniqueNotifications на:

CREATE UNIQUE INDEX NotificationDateFor ON Notifications (NotificationFor, DateToNotify, IsExtraordinary,NotificationData,NotificationDateFor,TypeNotification,RadioType,FriendsName,PrimaryId );

Теперь я не получаю ошибку, но я вижу дубликаты в моей таблице уведомлений. Любой намекает, как я могу улучшить вышеупомянутое и заставить это работать?

Чтобы улучшить вышесказанное, я читаю записи из файла и вставляю их в таблицы. Сначала я вычисляю свои данные и вставляю их в детали. В этом случае внутри цикла for я не использовал UNIQUE для уведомлений - мой UNIQUE для деталей работал нормально., Но если я сталкиваюсь с дубликатом из Details, я хочу остановить итерацию цикла for и перейти к следующей итерации, потому что я не хочу, чтобы дубликаты вводились в таблицу уведомлений - есть ли тип возврата в UNIQUE Query - если выполняется Подробнее Я нашел дубликат, я хочу переключить свой цикл на следующую итерацию - пропуская операторы вставки, относящиеся к таблице уведомлений. Извините, я знаю, что плохо объясняю вещи.

Редактировать:

У меня была добавлена ​​следующая запись в конец таблицы, хотя, как и до вставки, у меня была эта запись в исходном виде - теперь я не вижу более старую, но эта более новая была вставлена ​​в конце:

Подробная таблица - я не могу воспроизвести оба, потому что один был удален.

Аналог в таблице уведомлений: (запись с именем Тома Хэнкса вверху)

Запись имени Тома Хэнкса вверху

Запись повторяется с другим _id внизу в той же таблице:

Ниже я воспроизвожу таблицу "Детали", если вы заметите, что номер записи 90 больше не существует - потому что он, вероятно, был удален до вставки записи с тем же значением: _id а также PrimaryId значения отображаются)

РЕДАКТИРОВАТЬ:

Следующее - мое заявление вставки (для таблицы деталей):

public void insert(String birthDate, String name, String daysOld, String hoursOld, String uRi, String minutesOld, String months, String seconds, String timestamP, String weeks, String years, String isAdhoc){
        //  InsertHelper ih = new InsertHelper(db, "columnTable");

        String INUP= "INSERT OR REPLACE INTO Details (BirthDate, Name, isAdhoc, daysOld, hoursOld, imageUri, minutesOld, monthsOld, secondsOld, timestamp, weeksOld, yearsOld) " +
                "values ("+"'"+birthDate+"'"+","+"'"+name+"'"+","+"'"+isAdhoc+"'"+","+"'"+daysOld+"'"+","+"'"+ hoursOld+"'"+","+"'"+ uRi+"'"+","+"'"+minutesOld+"'"+","+"'"+ months+"'"+","+"'"+ seconds+"'"+","+"'"+timestamP+"'"+","+"'"+weeks+"'"+","+"'"+years+"'"+");";  
        mDb.execSQL(INUP);
    }

Я думаю, что ВСТАВКА ИЛИ ЗАМЕНА в вышеупомянутом может создать проблему.

1 ответ

Используйте уникальное ограничение для обеспечения уникальных значений.

private static final String VERSION_60_CREATE_TABLE = "CREATE TABLE "
        + TABLE_MARKERS + "(" + KEY_ID + " INTEGER PRIMARY KEY,"
        + KEY_MARKER_LOCATION_ID + " INTEGER," + KEY_MARKER_IMAGE_ID
        + " INTEGER DEFAULT -1," + KEY_MARKER_IMAGE_PATH + " TEXT,"
        + KEY_MARKER_SNIPPET + " TEXT," + KEY_MARKER_TITLE + " TEXT,"
        + " FOREIGN KEY(" + KEY_MARKER_LOCATION_ID + ") REFERENCES "
        + TABLE_LOCATIONS + "(" + KEY_ID + ")," + " CONSTRAINT UNQ_"
        + KEY_MARKER_IMAGE_ID + " UNIQUE (" + KEY_MARKER_IMAGE_ID
        + ") ON CONFLICT ABORT)";

Лучшая практика: в коде дайте ограничению значение полного имени. В приведенном выше примере используется UNQ_, объединенное с именем столбца для имени ограничения. С дизайнером db gui используйте имя ограничения от дизайнера.

Другие вопросы по тегам