0

「pois」というテーブルがあります。電話の GPS 位置に最も近いすべての位置を 500 m 以内で表示する SQL クエリを実行したいのですが、MySQL コードをどこかにコピーして SQLLite に使用しましたが、動作しません。おそらく誰でも実行できますクエリを SQLLite クエリ バージョンに変換するのを手伝ってください。

コードは次のとおりです。

Sub GPS_LocationChanged (Location1 As Location)

Loc1 = Location1.Latitude
Loc2 = Location1.Longitude

Dim Cursor As Cursor

Qry = "Select place_id,place_name,lat,lon,poi_catid, ( 6371 * acos( cos( radians( " & Loc1 & " ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( " & Loc2 & ") ) + sin( radians( " & Loc1 & " ) ) * sin( radians( lat ) ) ) ) as distance FROM pois HAVING distance < 0.5 ORDER BY distance"
    Cursor = SQL1.ExecQuery(Qry)
    For i = 0 To 15
    Cursor.Position = i
    ToastMessageShow(Cursor.GetString("place_name"),True)
    Next
    Cursor.Close
End Sub

エラーメッセージは次のとおりです。

android.database.sqlite.SQLiteException: そのような関数はありません: acos (コード 1):

4

2 に答える 2

1

SQLite は、使用している数学関数を提供していません。IFAIK では、Android にユーザー定義関数を追加することはできません。

データベースの行を制限するために外接する四角形を計算し、この四角形内のエントリについてデータベースにクエリを実行します。次に、行ごとに正確な距離を計算して、遠すぎるエントリを除外します。このようにして、計算時間も大幅に節約できます。

于 2013-11-14T11:04:33.583 に答える
0

データベース ステートメントで計算を行うことは、魔法のようなことではありません。コンピュータは、個々の行を個別に調べる必要があります。(効率的な空間クエリをサポートするように設計されたデータベース ソフトウェアがありますが、SQLite はそうではありません。) すべての行を選択して、VB で距離計算を行うこともできます。

于 2013-11-14T10:53:31.020 に答える