2012-06-25 57 views
1

我正在建立一個SQLite查詢StringString.format並將它傳遞到SQLiteDatabase.rawQuery。我在最後傳遞的整數參數被硬編碼爲零(我正在尋找大於零的任何值)。這在我所有的測試中都能正常工作,但我收到了現場的崩潰報告。我正在使用不提供詳細系統/環境信息的崩潰報告網站。這裏是崩潰的代碼: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中,我將把所有可用的sys信息轉儲到一個自定義的Flurry事件參數中,這樣我就得到了數據,然後嘗試你提出的解決方案並報告返回,如果成功的話也會拋出同樣的異常。我唯一的想法是,這兩種方法最終都會在某個特定點調用相同的nativeCompile方法,這是有道理的。 – Rich

+0

是的,如果你打算嘗試其中的一種,我肯定會嘗試直接使用'query'方法,它應該*可以在任何設備上工作,無論如何。如果我寫的是關於與'rawQuery'有關的錯誤,那麼肯定不會讓我感到驚訝的是,錯誤只是來自ICS設備。 Android 4.0採取了一系列安全措施,導致許多舊應用在4.0之前的設備上正常運行,但在運行4.0+的設備上發生崩潰。 –

+0

例如,ICS不再允許使用'file:///'方案直接訪問資產,並且如果您嘗試在UI線程上進行網絡訪問,則會導致應用程序崩潰,並且這些線程都允許在Gingerbread和更低版本上使用。所以這可能是因爲一些ICS應用程序正在考慮你的原始查詢是「不安全的」,並以某種方式導致你的應用程序崩潰。也就是說,「錯誤」是一個編碼問題,而不是某種例外,這似乎很奇怪。 –

1

我同意query而不是rawQuery是一個更好的解決方案,但String.Format()有選擇的區域設置的形式。不使用這個已經在幾個類似的情況下咬我:

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