15

次のような 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()です。つまり、値が既に行にある場合は、再度挿入されるため、行には同じ値の 2 つの値が含まれるようになります。

4

4 に答える 4

18

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 つの値が含まれるようになります。

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

于 2013-03-29T17:06:52.807 に答える
15

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

しかし、これは制約に依存します。将来必要に応じて、より多くの動作があります。

于 2013-03-29T17:03:46.930 に答える
3

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

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

さまざまな状況でさまざまなアクションを実行したい場合 (または、まだ SQL に習熟していない場合) は、最初のアプローチの方が簡単です。

于 2013-03-29T17:00:32.263 に答える
3

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

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

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

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

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

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

幸運を

于 2013-03-29T17:09:22.110 に答える