SQLiteDatabase.rawQuery中的字符串编码错误

时间:2012-06-25 21:37:39

标签: android sqlite debugging encoding

我正在使用String将SQLite查询构建为String.format并将其传递给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类中使用的默认值中的新内容。

2 个答案:

答案 0 :(得分:1)

你可以试试,

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

但是,强烈建议您直接使用SQLiteDatabase的{​​{1}}方法。鉴于它可以防止SQL注入,它似乎也可以防止奇怪的编码错误。

query

答案 1 :(得分:1)

我同意query而不是rawQuery是更好的解决方案,但String.Format()有一个选择区域设置的表单。在一些类似的情况下,不使用它会让我感到困惑:

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