2012-04-27 6 views
0

私のAndroidアプリケーションでクラッシュしたのは、SQLクエリ文字列の構築で異常な動作が原因です。ここでエラーがある:doubleをJavaのStringに変換するときの奇妙な動作

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 
      + ")"; 
} 

見ることができる、LocationColumns.SINLNG + "*" + sinlng + ")"sinlng*0.012027143*)になり、私は実際にはsinlngが二重であるので、これがどのように可能であるかわかりません...

私は問題を再現できません。クラッシュはAndroidマーケットコンソールからのものですが、私はすべてのコンテキストを持っていません。ユニークなクラッシュではなく、私は複数の出来事があります。

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

誰かが文字列に変換されたときにdoubleがどのように "*"を生成するかの手掛かりを持っていますか?

+3

私はそれが起こる可能性は疑問です。しかし、私はあなたのコードがエラーメッセージと一致するのを見ません。たとえば、コードでは2つのネストされた括弧のセットが作成され、エラーメッセージには1つのセットしかありません。おそらく、あなたは別のコードを見ているのでしょうか、それとも古いバージョンですか? –

+3

これは、パラメトリックSQLクエリが発明された理由です。 – mcfinnigan

+0

正確に返された文字列をログに記録し、それをあなたの質問に貼り付けることができますか? – waqaslam

答えて

0

m以内にいくつかのレポートを植えた後y APK、私は問題の原因を発見しました。 ZTE StarAddictで

、結果:

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

0.0121* 

である私は、これは意味がありません知っているが、これはそれがある方法です。データプロバイダに使用された場合

final static String QUERY = "distance > ?"; 

"distance &gt; ?" 

次のようになります。私は、他の文字列が「翻訳」されているため、このデバイスが実際に欠陥があると思います。

Googleでいくつかの調査を行いましたが、具体的なものは見つかりませんでした。

私のアプリケーションは100K +デバイスでアクティブで、ZTE StarAddictだけがそのように動作します。したがって私は自分のコードで間違いを除外することができます。

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

+0

ZTE Bladeと同じ動作です。すべての文字列定数はHTMLに変換されます( ">"は ">"になります)。 – EricLarch

2

私がなぜわからないんだけど、不足している「(」ただcoslng前に、あなたがチェックすることができ

EDITがされています?それを固定するおかげで、ちょうど印刷または検査する方法があります*がすでにそこに現れているかどうか、またはクエリーが構築された直後にチェックされているかもしれません。sinlngが0.012027143と一致するかどうかを検査してください。

これはどのように役立ちますか? )

+0

なぜdownvote?編集前に明らかに欠けていた括弧がありました... –

+1

問題を再現できないので、私はそれをすることはできません。クラッシュは外部デバイスから発生し、Google Playコンソールから自動的に報告されます。私はすべての値の組み合わせでこの関数のテストユニットを実行しましたが、決して結果に "*"を付けませんでした。 – EricLarch

関連する問題