Вариант 1 - Иметь подходящее ограничение
Одним из вариантов будет определение таблицы таким образом, чтобы объединенные 3 столбца образовывали ограничение UNIQUE и, следовательно, приводили к конфликту, если объединенные столбцы существуют.
например.
db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_2 + " TEXT," + COLUMN_3 + " TEXT," + COLUMN_4 + " TEXT, UNIQUE (" + COLUMN_2 + "," + COLUMN_3 + "," + COLUMN_4 + " ))");
В этом случае такая же комбинация значений не будет вставлена (так как метод insert
эффективно использует INSERT OR IGNORE, поэтому при возникновении конфликта INSERT игнорируется).
Вариант 2 - проверка количества строк в таблице
Альтернативным методом может быть проверка наличия в таблице уже данных, путем проверки количества строк.
В классе DatabaseHelper может быть метод, например: -
public boolean isTableEmpty(String tablename) {
return DatabaseUtils.queryNumEntries(this.getWritableDatabase(),tablename) < 1;
}
- Конечно, это можно изменить для проверки других сценариев
Вариант 3 - Запрос таблицы, чтобы увидеть, существует ли строка перед вставкой, например,
public boolean insertDataCheckingForDuplicate(String value1, String value2, String value3) {
SQLiteDatabase db = this.getWritableDatabase();
int rowcount = 0;
String whereclause = COLUMN_2 + "=? AND " + COLUMN_3 + "=? AND " + COLUMN_4 + "=?";
String[] whereargs = new String[]{value1,value2,value3};
Cursor csr = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
rowcount = csr.getCount();
csr.close();
if (rowcount > 0) {
return false;
}
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_2, value1);
contentValues.put(COLUMN_3, value2);
contentValues.put(COLUMN_4, value3);
long result = db.insert(TABLE_NAME, null, contentValues);
if (result == -1) {
return false;
} else
return true;
}
Вариант 4. Использование предварительно загруженной базы данных.
С помощью этого метода вы вводите предварительно загруженную базу данных (то есть база данных существует). База данных помещается в папку ресурсов и копируется из папки ресурсов в соответствующее место при первом открытии базы данных. Процесс проверяет, существует ли база данных, если она существует, то база данных открывается, а если нет, то база данных копируется.
Вы можете использовать SQLiteOpenAssethelper для упрощения этого процесса, см. android-sqlite-asset-helper . Есть также многочисленные примеры того, как сделать это самостоятельно в StackOverflow.