SQLiteDatabase: Вставить только в том случае, если значение не существует (не через команду raw SQL)
Я знаю, что есть команда SQL, которая выглядит примерно так: IF NOT EXISTS
, но поскольку класс Android SQLiteDatabase
имеет несколько прекрасных методов, мне было интересно, можно ли вставить значение, если оно не существует с помощью метода.
В настоящее время я использую это для вставки String
:
public long insertString(String key, String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(key, value);
return db.insert(DATABASE_TABLE, null, initialValues);
}
(db
является экземпляром SQLiteDatabase
.)
Я попробовал метод insertOrThrow()
вместо insert()
, но, похоже, он делает то же самое, что и insert()
. То есть, если значение уже находится в строке, оно снова вставлено, так что теперь строка имеет два значения одного и того же значения.
Ответы
Ответ 1
SQLiteDatabase: Вставить только в том случае, если значение не существует (не через raw SQL)
Поскольку вы не хотите использовать необработанные запросы, вы можете достичь этого, прежде чем вставлять, просто создайте некоторую функцию, которая будет проверять, есть ли значение в базе данных. Он может возвращать boolean (или int), и если он возвращает false, вы будете выполнять запрос insert.
Маленький пример:
public int getCount() {
Cursor c = null;
try {
db = Dbhelper.getReadableDatabase();
String query = "select count(*) from TableName where name = ?";
c = db.rawQuery(query, new String[] {name});
if (c.moveToFirst()) {
return c.getInt(0);
}
return 0;
}
finally {
if (c != null) {
c.close();
}
if (db != null) {
db.close();
}
}
}
if (getCount() == 0) {
//perform inserting
}
если значение уже находится в строке, оно снова вставлено, так что теперь строка имеет два значения одного и того же значения.
Это можно решить, используя правильные ограничения, которые не позволят вам вставлять дубликаты. Проверьте это:
Ответ 2
Вы можете установить CONFLICT_IGNORE поведение для конфликта вставки строки:
public long insertString(String key, String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(key, value);
return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
}
Но это зависит от ограничения. Если вам нужно в будущем, вам будет больше поведений.
Ответ 3
Есть два основных способа сделать это:
- Запросить базу данных. Вручную проверьте, существуют ли данные, а затем добавлены, если они не существуют.
- Используйте
CONSTRAINT
s. Определите свою схему SQL, чтобы разрешать уникальные данные для этого столбца.
Первый подход проще, если вы хотите выполнять разные действия в разных обстоятельствах (или если вы еще не владеете SQL.) Второй подход может быть выполнен с гораздо меньшим набором символов и может применяться повсеместно.
Ответ 4
Решение не в Android Api, а в базе данных. если вы хотите убедиться, что строка, которую вы вставляете, еще не присутствует в базе данных, существует два возможных решения.
-
при создании базы данных сделайте столбец (строку, которую вы хотите вставить) как UNIQUE
, это не позволит ему вводить дубликаты в этот столбец. и когда вы пытаетесь вставить и являетесь дубликатом, это вызовет ошибку; вы можете обрабатывать его с помощью обработки исключений.
-
Вы можете создать второй метод (вызывается после каждой вставки, это дорого), который проверяет наличие дубликатов в таблице и удаляет их.
Я бы пошел с подходом 1.
Вот пример синтаксиса UNIQUE
create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));
удача