SQLite сохранение дубликата - PullRequest
       5

SQLite сохранение дубликата

2 голосов
/ 08 февраля 2020

В моем приложении есть база данных SQLite. Я пытаюсь сохранить некоторые записи в своей базе данных, но запрашиваю сохранение дублирующих элементов.

Код:

public void addValue(String userid, String fullname, String username) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME +" WHERE userid="+userid+"", null);
    if (!cursor.moveToFirst()) {
        db.beginTransaction();
        try {
            ContentValues values = new ContentValues();
            values.put(USERID, userid);
            values.put(FULLNAME, fullname);
            values.put(USERNAME, username);
            db.insert(TABLE_NAME, null, values);
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }else{
        System.out.println("This exist: "+userid+" "+fullname);
    }
    cursor.close();
    db.close();
}

Обычно я проверяю дублирующие элементы с помощью запроса db.rawQuery("SELECT * FROM " + TABLE_NAME +" WHERE userid="+userid+"", null);, но все еще сохраняется.

Что здесь не так? Спасибо.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Вы не опубликовали оператор определения таблицы, но, поскольку вы запрашиваете проверку, существует ли userid, уже перед вставкой новой строки, я предполагаю, что столбец userid не является UNIQUE, как следует. Избавьте себя от всех этих проблем и определите их как UNIQUE, добавив к определению столбца ключевое слово UNIQUE:

CREATE TABLE table_name(
    ...,
    userid TEXT UNIQUE,
    ...
);

Теперь вы можете использовать метод insert() без предварительного проверяя что-либо:

int result = db.insert(TABLE_NAME, null, values);
if (result == -1) {
    System.out.println("This exist: "+userid+" "+fullname);
}

Если insert() возвращает -1, это означает, что он потерпел неудачу, и вы знаете, что, поскольку нет никаких других ограничений, он не прошел, потому что userid уже существует. Любое другое значение, возвращаемое insert() (равно rowid новой вставленной строки), указывает, что оно выполнено успешно. Если вы решите внести это изменение, вам придется удалить приложение с устройства и запустить его заново, чтобы база данных была создана заново, или обновить версию базы данных.

0 голосов
/ 08 февраля 2020

вы можете попытаться использовать

db.insertWithOnConflict (TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE);

...