SQLite: предотвращать дублирование - PullRequest
2 голосов
/ 09 июля 2009

Я хотел бы создать таблицу для хранения настроек устройства. В таблице три строки: id, имя_параметра и значение_параметра.

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

DATABASE_CREATE = "create table DATABASE_TABLE (KEY_ID INTEGER PRIMARY KEY AUTOINCREMENT, KEY_NAME INTEGER not null, VALUE TEXT not null);

, а затем строки сохраняются с помощью следующего метода:

private long insertRow(int rowParameter, String rowValue, SQLiteDatabase db){
    long res = -1;
    ContentValues settingsParameterValues = new ContentValues();
    settingsParameterValues.put(KEY_NAME, rowParameter);
    settingsParameterValues.put(VALUE, rowValue);
    if(db != null){
        res = db.insert(DATABASE_TABLE, null, settingsParameterValues);
    }
    return res;
}

При создании базы данных сохраняются значения по умолчанию:

@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE);
        insertRow(PRIVACY_LEVEL_ROW_INDEX, "0", db);
        insertRow(STREAM_TITLE_ROW_INDEX, "untitled", db);
        insertRow(STREAM_TAGS_ROW_INDEX, "", db);
    }

Однако проблема с методом insertRow () заключается в том, что он не может предотвратить дублирование записей.

Кто-нибудь знает, как предотвратить повторяющиеся записи в этом случае?

Ответы [ 4 ]

9 голосов
/ 09 июля 2009

Вы можете использовать ограничение столбца UNIQUE.

Ограничение UNIQUE вызывает создание уникального индекса для указанных столбцов.

2 голосов
/ 09 июля 2009

Я бы создал UNIQUE CONSTRAINT в определении таблицы базы данных. Это автоматически предотвратит повторяющиеся записи, и это практически единственный безопасный для параллелизма способ сделать это!

Кроме того, не забывайте о CHECK CONSTRAINT, который может оказаться более полезным, если вам нужно определить более сложные правила для данных в ваших таблицах.

0 голосов
/ 09 июля 2009

В вашем случае правильный первичный ключ был бы parameter_name.

0 голосов
/ 09 июля 2009

Вы пытаетесь предотвратить это с помощью кода или в базе данных?

Если вы пытаетесь запретить код, вам нужно сделать SELECT и посмотреть, существует ли уже строка.

Если вы пытаетесь предотвратить его из базы данных, вам нужно добавить ограничение UNIQUE для каждой строки, в которой вы не хотите разрешать дублирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...