1

SQLite クエリをStringwithとして作成し、String.formatそれを に渡していSQLiteDatabase.rawQueryます。最後に渡す整数パラメーターは、ゼロにハードコーディングされています (ゼロより大きい値を探しています)。これはすべてのテストで正常に機能しますが、現場からクラッシュ レポートを取得しています。詳細なシステム/環境情報を提供しないクラッシュ レポート Web サイトを使用しています。クラッシュしているコードは次のとおりです。

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 クラスで使用されるデフォルトでこれが新しいものである可能性があります。

4

2 に答える 2

1

あなたは試すことができます、

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

ただし、代わりにのメソッドを直接使用することを強くお勧めします。SQLインジェクションから保護することを考えると、奇妙なエンコーディングのバグからも保護する可能性が高いようです。SQLiteDatabasequery

String[] selectionArgs = new String[] { ColumnName };
Cursor c = db.query(TableName, null, "? > 0", selectionArgs, null);
于 2012-06-25T22:15:42.583 に答える
1

より良い解決策ではqueryなく、ロケールを選択するフォームがあることに同意します。これを使用しないと、いくつかの同様の状況で私を噛みました:rawQueryString.Format()

String query = String.format(Locale.US,
                             "SELECT * FROM %s WHERE %s > %d",
                             TableName,
                             ColumnName,
                             0);
于 2012-06-26T04:12:08.530 に答える