_IF NOT EXISTS
_のようなSQLコマンドがあることは知っていますが、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()
と同じように見えます。つまり、値がすでに行にある場合は、再度挿入されるため、行には同じ値の2つの値が含まれます。
SQLiteDatabase:値が存在しない場合にのみ挿入します(生のSQLコマンドを介さない)
生のクエリを使用したくないので、挿入する前にそれを実現できます。値がすでにデータベースにあるかどうかをテストする関数を作成するだけです。 boolean(またはint)を返す可能性があり、falseを返す場合は、挿入クエリを実行します。
少し例:
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);
}
しかし、これは制約に依存します。将来必要になれば、さらに多くの動作があります。
解決策はAndroid Apiではなくデータベースにあります。挿入する文字列がデータベースに存在しないことを確認したい場合は、2つの解決策があります。
データベースを作成するときに、列(挿入したい文字列)をUNIQUE
にすると、その列に重複が入力されなくなります。挿入しようとすると、エラーが発生します。例外処理を介して処理できます。
テーブル内の重複をチェックして削除する2番目のメソッド(挿入ごとに呼び出されます。これはコストがかかります)を作成できます。
私はアプローチ1で行きます。
ここにサンプルのUNIQUE
構文があります
create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));
幸運を
これを行うには、2つの基本的な方法があります。
CONSTRAINT
s を使用します。この列に一意のデータのみを許可するようにSQLスキーマを定義します。1つ目のアプローチは、さまざまな状況でさまざまなアクションを実行したい場合(または、SQLにまだ習熟していない場合)に簡単です。2つ目のアプローチは、入力を大幅に減らして行うことができ、普遍的に適用できます。