SQLiteDatabase запрашивает сбой с целыми числами в незападных локалях - PullRequest
0 голосов
/ 26 мая 2018

Я использую следующий код:

private static final String JUMP_COUNT_QUERY_FORMAT =
        "select count(*) " +
                "from log_entry " +
                "inner join log_entry_rig on log_entry._id = log_entry_rig.log_entry " +
                "where log_entry_rig.rig = {0}"; //TODO BUG crash in arabic

, а затем позже:

String query = MessageFormat.format(JUMP_COUNT_QUERY_FORMAT, rigId);
Cursor cursor = null;
     try
     {
         cursor = db.rawQuery(query, null);
         ...
     }

, что приводит к этой ошибке в трассировке стека, в которой вы можете видеть, что 1 в rigIdпревратился в арабский 1 (١):

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: org.myapp, PID: 4913
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.myapp/org.myapp.appLog2}: android.database.sqlite.SQLiteException: no such column: ١ (code 1 SQLITE_ERROR): , while compiling: select count(*) from log_entry inner join log_entry_rig on log_entry._id = log_entry_rig.log_entry where log_entry_rig.rig = ١
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2925)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
     Caused by: android.database.sqlite.SQLiteException: no such column: ١ (code 1 SQLITE_ERROR): , while compiling: select count(*) from log_entry inner join log_entry_rig on log_entry._id = log_entry_rig.log_entry where log_entry_rig.rig = ١
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:901)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:512)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
        at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1347)

Теперь я знаю, что MessageFormat не имеет реального использования для локалей, но у меня есть много обращений по всему приложению к SQLite, и я хочу защитить его от сбоев, таких какэто если он вызывается на устройствах с локалями, которые включают разные системы счисления (арабский, тайский и т. д.).Что можно сделать в этом отношении?

...