2

私のアプリケーションでは、重複するエントリを持たずにエントリを追加しようとしています。重複している場合は、ユーザーに通知して再試行してもらいます。私はほとんど知らない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ペアを作成する方法がわかりません。これが最も簡単だと言われました。誰かがこれらの方法のいずれかを修正したり、コメントしたりできる場合は、それをいただければ幸いです。

ありがとう

4

3 に答える 3

3

私があなたが望んでいることは次のとおりです。2行に同じ緯度と経度のペアを入力することを決して許可しないテーブルDatabase_Table(私がそう言うかもしれないが最もわかりやすい名前ではない)を持つこと。

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

テーブルがすでに存在する場合は、SQLコマンドCREATEINDEXを使用してキーを最も簡単に追加できます。どのテーブルにもPRIMARYKEYが1つしかない場合があるため、テーブルにPRIMARY KEYがすでにある場合は、この目的でUNIQUEKEYを使用する必要があります。

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

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)
于 2009-10-28T02:02:05.417 に答える
1

生の緯度/経度を使用することは、重複をチェックするための優れた方法ではないように思われます。AndroidのGeoPoint1E6形式を使用して可能な緯度と経度の組み合わせはそれぞれ、5平方インチ未満の領域をカバーします。もちろん、このサイズは地球上のどこに立っているかによって異なりますが、かなり良い経験則になります。したがって、測定したいもののサイズに応じて、少なくとも緯度/経度を最も近い10、100、または1000に切り上げる必要があります。

データベースに保存する前に:

lat = (lat/1000)*1000; 
lon = (lon/1000)*1000;

地球上の緯度/経度のポイント間の距離を計算するための優れたツールは次のとおりです。

http://jan.ucc.nau.edu/~cvm/latlongdist.html

于 2009-10-28T16:45:42.577 に答える
0

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

作成してからの理由は、UNIQUE INDEX私にはうまくいかないようで、それが私の目的であるかSQLiteの目的であるかにかかわらず、達成するのが難しい作業であることがわかりました。

その目的は些細なことではなく、アプローチは初歩的なものかもしれませんが、私が必要としていることを実行します。

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

于 2010-02-02T17:06:35.610 に答える