数据库表由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)));
}
}
但某些用户会遇到以下内容而不是西里尔文:
问题可能与什么有关?我从来没有使用任何特殊的编码。根据这里https://stackoverflow.com/a/4276758/1214162非常权威的答案,默认情况下应将DB设置为UTF。
重要发现
它发生在json反序列化2+时间。
如果应用程序是从头开始安装的,并且它第一次加载信息 - 包含西里尔文的字段一切正常。
如果它发现服务器上有新数据,它会调用drop + re-create for tables并开始下载新的jsons。
这里出现了相同的西里尔字段!
答案 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");