0

SQLクエリ文字列構造の奇妙な動作が原因でAndroidアプリケーションがクラッシュしました。エラーは次のとおりです。

Caused by: android.database.sqlite.SQLiteException: near ")": syntax error: , while
compiling: SELECT [...], (0.6773931613745379*coslat*(coslng*0.9999276712889913
+sinlng*0.012027143*)+0.7356211694364222*sinlat) [...]

エラーはここから正確に発生します: sinlng*0.012027143*)<== *)最後に

この文字列は、次の関数によって作成されます。

public static String buildDistanceQuery(double latitude, double longitude) {
    final double coslat = Math.cos(MathUtils.deg2rad(latitude));
    final double sinlat = Math.sin(MathUtils.deg2rad(latitude));
    final double coslng = Math.cos(MathUtils.deg2rad(longitude));
    final double sinlng = Math.sin(MathUtils.deg2rad(longitude));
    return "(" + coslat + "*" + LocationColumns.COSLAT
            + "*(" + LocationColumns.COSLNG + "*" + coslng
            + "+" + LocationColumns.SINLNG + "*" + sinlng
            + ")+" + sinlat + "*" + LocationColumns.SINLAT 
            + ")";
}

ご覧のとおり、sinlngは二重であるため、これがどのように可能にLocationColumns.SINLNG + "*" + sinlng + ")"なるsinlng*0.012027143*)かはわかりません...

問題を再現できません。クラッシュはAndroidマーケットコンソールから発生し、すべてのコンテキストがありません。これはユニークなクラッシュではなく、何度も発生しました。

StringBuilder()を使用してみることができますが、問題が修正されるかどうかはわかりません。

誰かが文字列に変換されたときにdoubleが「*」を生成する方法の手がかりを持っていますか?

4

2 に答える 2

2

理由はわかりませんが、直前に「(」がありませんので、確認してcoslngいただけますか?

編集:それを修正してくれてありがとう、作成された文字列を印刷または検査する方法、*がすでにそこに表示されているかどうかを確認する方法、またはクエリがビルドされた直後にありますか?そして多分sinlngそれが0.012027143に一致するかどうかseにdoubleを検査します。

これがどのように役立つかはわかりませんが、その始まりです:)

于 2012-04-27T13:33:05.350 に答える
0

APK 内にいくつかのレポートを作成した後、問題の原因を突き止めました。

ZTE StarAddict での結果:

final double sinlat = Math.sin(MathUtils.deg2rad(47.3572329));

0.0121*

意味がないのはわかっていますが、こういうことです。他の文字列が「翻訳」されているため、このデバイスには本当に欠陥があると思います。

final static String QUERY = "distance > ?";

になる

"distance &gt; ?"

データプロバイダーに使用される場合。

Google でいくつかの調査を行いましたが、特定の情報は見つかりませんでした。

参考までに、私のアプリケーションは 10 万以上のデバイスでアクティブであり、ZTE StarAddict だけがそのように動作します。したがって、コードの間違いを除外できます。

誰かが私と同じ問題を抱えている場合は、いくつかの手がかりを聞いてうれしいです.

于 2012-04-28T16:30:01.957 に答える