2012-04-27 3 views
0

SQL 쿼리 문자열 구성에서 이상한 동작이 발생하여 Android 응용 프로그램에 장애가 발생합니다.Java에서 double을 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이 double 일 때 어떻게 이것이 가능할 수 있는지 보지 못했습니다 ...

문제를 재현 할 수 없습니다. 충돌은 Android 마켓 콘솔에서 발생하며 모든 컨텍스트가 없습니다. 그것은 독특한 충돌이 아니며 여러 번 발생했습니다.

StringBuilder()를 사용할 수는 있지만 문제를 해결할 수 있는지 확실하지 않습니다.

String으로 변환 할 때 double이 "*"를 생성하는 방법에 대한 단서가 있습니까?

+3

그럴 수 있습니다. 하지만 귀하의 코드가 오류 메시지와 일치하지 않습니다.예를 들어, 코드는 중첩 된 두 세트의 괄호를 만드는 것처럼 보이지만 오류 메시지에는 하나의 세트 만 있습니다. 아마도 다른 코드 나 이전 버전을보고있을 것입니다. –

+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 전에 "("실종이

편집 : 그것을 고정 감사합니다, 그냥 인쇄하거나 검사 할 수있는 방법이 *가 이미 표시되어 있는지 또는 쿼리가 작성된 직후인지 확인하기 위해 문자열이 만들어졌습니다. sinlng이 0.012027143과 일치하면 sinlng을 검사합니다.

이 방법이 도움이되지만 시작은 확실하지 않습니다.)

+0

왜 downvote? 편집하기 전에 분명히 누락 된 괄호가있었습니다. –

+1

문제를 재현 할 수 없기 때문에 그럴 수 없습니다. 충돌은 외부 기기에서 발생하며 Google Play 콘솔에서 자동으로보고됩니다. 이 값에 대한 모든 조합으로이 함수에 대한 테스트 유닛을 작성 했으므로 결과에 "*"를 표시하지 않습니다. – EricLarch

관련 문제