どのsqliteステートメントが重複エントリを示す結果を生成できますか?アンドロイド
-
06-07-2019 - |
質問
私のアプリケーションでは、重複エントリを持たずにエントリを追加しようとしています。重複がある場合は、ユーザーに通知して、再試行してもらいます。私はほとんど知らない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)
生のlat / longを使用することは、重複をチェックするのに優れた方法ではないように思えます。 AndroidのGeoPoint 1E6形式を使用して可能な各緯度/経度の組み合わせは、5平方インチ未満の領域をカバーします。もちろん、このサイズは、あなたが立っている地球上の場所によって異なりますが、かなり良い経験則になります。したがって、測定したいもののサイズに応じて、少なくとも緯度/経度を最も近い10、100、または1000に切り上げる必要があります。
データベースに保存する前:
lat = (lat/1000)*1000;
lon = (lon/1000)*1000;
地球上の緯度/経度ポイント間の距離を計算するための優れたツールは次のとおりです。