默认的SQLite DB编码返回错误的西里尔符号

时间:2015-12-16 00:14:49

标签: android sqlite encoding

数据库表由simple:

创建
public class DBHelper extends SQLiteOpenHelper {

    public static final String TABLE_ITEMS = "items";
    public static final String ITEMS_DB_CREATE = "create table "
                    + TABLE_ITEMS + "("
                    + ITEMS_ID + " integer primary key autoincrement, "
                    + ITEMS_NAME + " text, "
                    + ITEMS_DESCRIPTION + " text, "
                    + ITEMS_TYPE + " text);";

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

@Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(ITEMS_DB_CREATE);
    }

表格填充了从对https://api.worldofwarships.ru/wows/encyclopedia/achievements/?application_id=demo

的Web API调用中收到的一些数据

GSON用于去序列化。

获取项目的代码:

public class ItemsFetcher {
    private SQLiteDatabase database;
    private DBHelper db_helper;

    public ItemsFetcher() {
    }

    public ItemsFetcher open() throws SQLException {
        db_helper = new DBHelper(App.getAppContext());
        database = db_helper.getWritableDatabase();
        return this;
    }

    public void close() {
        database.close();
    }

    String[] columns = {
            DBHelper.ITEMS_ID,
            DBHelper.ITEMS_NAME,
            DBHelper.ITEMS_DESCRIPTION
    };

    public Cursor fetchItems() {
        return database.query(DBHelper.TABLE_ITEMS, columns, null, null,
                null, null, DBHelper.ITEMS_ID);
    }

然后,应用程序周围的几个地方会显示信息:

@Override
public void bindView(View view, Context context, Cursor cursor) {
    if(locale.equals("ru") || locale.equals("uk") || locale.equals("be") || locale.equals("kk")) {
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
tvTitle.setText(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.ITEMS_NAME)));
    }
    else {
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
tvTitle.setText(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.ITEMS_NAME)));
   }
}

某些用户会遇到以下内容而不是西里尔文:

enter image description here

问题可能与什么有关?我从来没有使用任何特殊的编码。根据这里https://stackoverflow.com/a/4276758/1214162非常权威的答案,默认情况下应将DB设置为UTF。

重要发现

  

它发生在json反序列化2+时间。

     

如果应用程序是从头开始安装的,并且它第一次加载信息 - 包含西里尔文的字段一切正常。

     

如果它发现服务器上有新数据,它会调用drop + re-create for tables并开始下载新的jsons。

     

这里出现了相同的西里尔字段!

1 个答案:

答案 0 :(得分:0)

API在304 NOT MODIFIED中返回null Charset

决定改变

String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

String json = new String(response.data, "UTF-8");