Создать уникальный индекс, не помогающий остановить дубликаты
У меня есть основная таблица базы данных с именем детали с тремя интересующими колонками -
_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 используйте имя ограничения от дизайнера.