我的Android应用程序崩溃来自SQL查询字符串构造中的奇怪行为。这是错误:
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 Market控制台,我没有所有上下文。这不是一个独特的崩溃,我有多次出现。
我可以尝试使用StringBuilder(),但我不确定它是否会纠正这个问题。
有人知道double在转换为String时如何生成“*”吗?
答案 0 :(得分:2)
我不知道为什么,但是有一个缺失的“(”就在coslng
之前,你能查一下吗?
编辑:感谢您修复它,有一种方法可以打印或检查字符串,检查*是否已经出现在那里,或者只是在构建查询之后?并且可能检查双sinlng
是否匹配0.012027143。
不确定这会有什么帮助,但它是一个开始:)
答案 1 :(得分:0)
在我的APK中设置了一些报告后,我找到了问题的根源。
在中兴StarAddict上,结果如下:
final double sinlat = Math.sin(MathUtils.deg2rad(47.3572329));
是
0.0121*
我知道这没有意义,但这就是它的方式。我想这个设备确实存在缺陷,因为其他字符串正在被“翻译”:
final static String QUERY = "distance > ?";
变为
"distance > ?"
用于数据提供者。
我在Google上做了一些研究,但找不到具体的内容。
有关信息,我的应用程序在100K +设备上处于活动状态,只有ZTE StarAddict的行为类似。因此,我们可以在代码中排除错误。
如果有人遇到与我相同的问题,我会很高兴听到一些线索。