どのsqliteステートメントが重複エントリを示す結果を生成できますか?アンドロイド

StackOverflow https://stackoverflow.com/questions/1634752

質問

私のアプリケーションでは、重複エントリを持たずにエントリを追加しようとしています。重複がある場合は、ユーザーに通知して、再試行してもらいます。私はほとんど知らないSQLiteを使用して、これら2つの方法を試しましたが、どちらがより良い、より効率的な、またはより良い開発方法を知りたいですか?

最初の方法:

db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE + 
"(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rating +
" WHERE NOT EXISTS (SELECT 1 FROM " + DatabaseHelper.DATABASE_TABLE +
" WHERE LATITUDE = " + latitude + " AND LONGITUDE = " + longitude + ")");

2番目の方法:

    long id = -1;
    try {
        id = db.compileStatement(
                "SELECT COUNT(*) FROM " + DatabaseHelper.DATABASE_TABLE
                        + " WHERE LATITUDE = " + latitude
                        + " AND LONGITUDE = " + longitude)
                .simpleQueryForLong();
    } catch (NullPointerException e) {
        return -1;
    }
    return id;

最初の方法では、値を挿入または無視します。そうすることで確認し、呼び出しの前に行の行カウントを変数に保存し、その関数を呼び出し、その結果を確認します。結果が呼び出し前よりも高くない場合、挿入は無視され、「値が存在します」というメッセージをユーザーに表示します。 (非常にずさんな、私は知っていますが、必死の時間は必死の措置を必要とします)

2番目の方法は、格納する数値に一致する行の実際のカウントを返します。数値が1を超えて返された場合、ユーザーに「値が存在します」というメッセージを表示します。

私はさまざまな方法を試みて行き来しましたが、SQLiteを設定してUNIQUEペアを持つ方法がわかりません。これは最も簡単だと言われました。誰かがこれらの方法のいずれかを修正したり、コメントしたりできるなら、それは大歓迎です。

ありがとう

役に立ちましたか?

解決 3

2番目のアプローチ(上記参照)を使用することにしました

UNIQUE INDEX を作成して以来の理由は、私には役に立たないと思われ、それがSQLiteの終了によるものか、SQLiteの終了によるものかを達成するのが難しいタスクであることが判明しました。

その目的は簡単ではなく、アプローチは初歩的かもしれませんが、それは私がそれをするために必要なことをします。

このような状況に遭遇した人々がここに残された答えの影響を受け、私よりも幸運を祈っていることを願っています。

他のヒント

これが私があなたが望むことを理解しています:2行に同じ緯度と経度のペアを入力することを決して許可しないテーブルDatabase_Table(最もわかりやすい名前ではありません)とする

正しければ、列の緯度と経度を組み込むPRIMARY KEYまたはUNIQUE KEYを宣言します。そうすると、同じペアをINSERTしようとすると例外がスローされ、キャッチしてユーザーに通知できます。この手法を使用すると、クエリでWHERE NOT EXISTS(...)句を使用する必要がなくなります。単純なINSERTを実行し、SQLiteにUNIQUEness制約の違反を警告させます。

テーブルが既に存在する場合、SQLコマンド CREATE INDEX 。テーブルには1つのPRIMARY KEYしか設定できないため、テーブルにPRIMARY KEYが既にある場合は、この目的でUNIQUE KEYを使用する必要があります。

使用するCREATE INDEXステートメントの最も単純な形式は次のとおりです。

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top