在SQLiteDatabase.rawQuery字符串编码错误(String encoding er

2019-09-30 04:29发布

我建立一个SQLite查询作为StringString.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的类所使用的默认设置一些新的东西。

Answer 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);


Answer 2:

我同意query ,而不是rawQuery是一个更好的解决方案,但String.Format()有选择的区域设置的形式。 不使用这种咬我在几个类似的情况:

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


文章来源: String encoding error in SQLiteDatabase.rawQuery