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

标签 android sqlite debugging encoding

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

最佳答案

你可以试试,

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

但是,我强烈建议您直接使用SQLiteDatabasequery 方法。鉴于它可以防止 SQL 注入(inject),它似乎也可以防止奇怪的编码错误。

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

关于android - SQLiteDatabase.rawQuery 中的字符串编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197731/

相关文章:

android - 如何去除出现在底部的黑条?

java - 当我从一个 fragment 滑动到另一个 fragment 时,我的应用程序崩溃了(错误 : canScrollHorizontally()' on a null object reference)

javascript - 需要在 Internet Explorer 脚本错误中查找行/字符的实际位置?

debugging - 使用 PHPStorm 8 进行 Xdebug — 在不存在的断点处打开错误的文件

debugging - 安装 WinDBG

android - Fragment 中的 Asynctask 生命周期

android - RxJava2 定时器和 combineLatest

mysql - SQL 更改结果

database - 在大型应用程序中使用 Qt 数据库

android - 用户输入的撇号使 android 应用程序崩溃(与 SQL 相关)