web-dev-qa-db-ja.com

SQLiteDatabase:値が存在しない場合にのみ挿入します(生のSQLコマンドを介さない)

_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);
}
_

dbSQLiteDatabaseのインスタンスです。)

insertOrThrow()の代わりにinsert()を試しましたが、insert()と同じように見えます。つまり、値がすでに行にある場合は、再度挿入されるため、行には同じ値の2つの値が含まれます。

15
eightx2

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つの値が含まれます。

これは、重複を挿入できない適切な制約を使用することで解決できます。これをチェックして:

16
Simon Dorociak

行の挿入の競合に対して 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);
}

しかし、これは制約に依存します。将来必要になれば、さらに多くの動作があります。

13
neworld

解決策はAndroid Apiではなくデータベースにあります。挿入する文字列がデータベースに存在しないことを確認したい場合は、2つの解決策があります。

  1. データベースを作成するときに、列(挿入したい文字列)をUNIQUEにすると、その列に重複が入力されなくなります。挿入しようとすると、エラーが発生します。例外処理を介して処理できます。

  2. テーブル内の重複をチェックして削除する2番目のメソッド(挿入ごとに呼び出されます。これはコストがかかります)を作成できます。

私はアプローチ1で行きます。

ここにサンプルのUNIQUE構文があります

create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

幸運を

3
PK0513

これを行うには、2つの基本的な方法があります。

  1. データベースをクエリします。データが既に存在するかどうかを手動で確認し、存在しない場合は追加します。
  2. CONSTRAINTs を使用します。この列に一意のデータのみを許可するようにSQLスキーマを定義します。

1つ目のアプローチは、さまざまな状況でさまざまなアクションを実行したい場合(または、SQLにまだ習熟していない場合)に簡単です。2つ目のアプローチは、入力を大幅に減らして行うことができ、普遍的に適用できます。

3
Sam