私の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がどのように "*"を生成するかの手掛かりを持っていますか?
私はそれが起こる可能性は疑問です。しかし、私はあなたのコードがエラーメッセージと一致するのを見ません。たとえば、コードでは2つのネストされた括弧のセットが作成され、エラーメッセージには1つのセットしかありません。おそらく、あなたは別のコードを見ているのでしょうか、それとも古いバージョンですか? –
これは、パラメトリックSQLクエリが発明された理由です。 – mcfinnigan
正確に返された文字列をログに記録し、それをあなたの質問に貼り付けることができますか? – waqaslam