2012-06-25 3 views
1

StringString.format이라는 SQLite 쿼리를 작성하고 SQLiteDatabase.rawQuery으로 전달합니다. 끝에 전달하는 정수 매개 변수는 0으로 하드 코딩되어 있습니다 (저는 0보다 큰 값을 찾고 있습니다). 이것은 모든 테스트에서 정상적으로 작동하지만 현장에서 충돌 보고서를 받고 있습니다. 나에게 세부적인 시스템/환경 정보를주지 않는 크래시보고 웹 사이트를 사용하고 있습니다.SQLiteDatabase.rawQuery의 문자열 인코딩 오류

String query = String.format("SELECT * FROM %s WHERE %s > %d", 
          TableName, 
          ColumnName, 
          0);  
Cursor c = db.rawQuery(query, null); 

예외가 슬로우는 다음과 같습니다 :

android.database.sqlite.SQLiteException: no such column: Û°: , while 
compiling: SELECT * FROM TableName WHERE ColumnName > Û° 

와 충돌하기 전에 스택 추적의 마지막 몇 줄을 있습니다 : 여기에 충돌되는 코드입니다

SQLiteCompiledSql.java:-2:in android.database.sqlite.SQLiteCompiledSql.native_compile 
SQLiteCompiledSql.java:68:in android.database.sqlite.SQLiteCompiledSql.<init> 
SQLiteProgram.java:143:in android.database.sqlite.SQLiteProgram.compileSql 

인코딩 오류 여야합니다. 그러나, 나는 이것이 무엇의 원인인지 말하는 방법을 모른다. 나는 데이터베이스를 만들고 연결하는 높은 수준의 방법으로 SQLiteOpenHelper을 사용하고 있으므로 명시 적으로 인코딩을 설정하지는 않습니다. 또한 오류 보고서는 적지 만 ICS를 실행하는 장치에서만 제공되기 때문에 ICS의 SQLite 클래스에서 사용되는 기본값의 새로운 기능 일 수 있습니다.

+0

안녕하세요, 저는 궁금 해서요 ... 이상한 인코딩 오류가 계속 나고 있습니까? –

답변

1

당신은 시도 할 수,

String sql = "SELECT * FROM ? WHERE ? > ?"; 
String[] selectionArgs = new String[] { TableName, ColumnName, "0"}; 
Cursor c = db.rawQuery(sql, selectionArgs); 

그러나, 나는 강력하게 대신 SQLiteDatabasequery 방법의 직접 사용을 제안 . SQL 인젝션을 방지한다는 점을 감안할 때 이상한 인코딩 버그를 막을 수도 있습니다.

String[] selectionArgs = new String[] { ColumnName }; 
Cursor c = db.query(TableName, null, "? > 0", selectionArgs, null); 
+0

나는 그것을보고 다시보고 할 것이다. 힘든 것은 필드에서 발생하며 내보고 서비스는 현재 로케일과 같은 추가 정보를 알려주지 않습니다.이 코드를 try/catch에서 랩핑하는 것이 무엇인지 테스트 할 것입니다 나는 모든 데이터를 사용자 정의 Flurry 이벤트 param에 덤프하여 제안 된 솔루션을 시도하고 성공하면 동일한 예외를 throw합니다. 이것에 대한 유일한 생각은 두 방법 모두 특정 지점에서 동일한 nativeCompile 메서드를 호출하게된다는 것입니다. – Rich

+0

네가 두 가지 중 하나를 시도한다면 분명히 무엇이든 상관없이 모든 장치에서 * 작동해야하는'query' 메소드를 직접 사용해 볼 것입니다. 'rawQuery'와 관련이있는 에러에 대해 쓰고 있다면, 에러가 ICS 디바이스에서만 발생한다는 것은 놀랄 일이 아닙니다. 안드로이드 4.0에서 여러 가지 보안 조치가 취해 졌기 때문에 많은 구형 앱이 4.0 이전 버전의 기기에서는 올바르게 작동하지만 4.0+ 이상을 실행하는 기기에서는 오류가 발생했습니다. –

+0

예를 들어 ICS는 더 이상 "file : ///"체계를 사용하여 자산에 직접 액세스 할 수 없으며 Gingerbread 이하에서 허용 된 UI 스레드에서 네트워크 액세스를 시도하면 앱이 중단됩니다. 따라서 ICS 응용 프로그램 중 일부가 원시 쿼리가 "안전하지 않은"것으로 간주되어 결과적으로 응용 프로그램이 손상 될 수 있습니다. 즉, "오류"는 일부 종류의 예외가 아니라 인코딩 문제라는 것이 이상하게 보입니다. –

1

나는 query보다는 rawQuery이 더 나은 해결책이 동의하지만, String.Format() 로케일을 선택하는 형태를 갖는다. 이것을 사용하지 않으면 몇 가지 유사한 상황에서 나를 물 렸습니다.

String query = String.format(Locale.US, 
          "SELECT * FROM %s WHERE %s > %d", 
          TableName, 
          ColumnName, 
          0);