0

我的 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() 但我不确定它是否能解决问题。

有人知道双精度如何在转换为字符串时生成“*”吗?

4

2 回答 2

2

我不知道为什么,但是在 之前缺少一个“(” coslng,你能检查一下吗?

编辑:感谢您修复它,有一种方法可以打印或检查制作的字符串,检查 * 是否已经出现在那里,或者在构建查询之后?sinlng如果它与 0.012027143 匹配,可能会检查双精度。

不知道这会有什么帮助,但它是一个开始:)

于 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; ?"

当用于数据提供者时。

我在谷歌上做了一些研究,但找不到任何具体的东西。

有关信息,我的应用程序在 100K+ 设备上处于活动状态,只有 ZTE StarAddict 的行为如此。因此,我们可以排除我的代码中的错误。

如果有人和我有同样的问题,我很乐意听到一些线索。

于 2012-04-28T16:30:01.957 回答