我必须把一些信息放到捆绑包中。然后我使用parsel并保存到blob中的SQlite。
ByteArrayOutputStream valueStream = new ByteArrayOutputStream();
try {
ContentValues rows = new ContentValues();
rows.put("name", name);
Parcel p = Parcel.obtain();
bundle.writeToParcel(p, 0);
valueStream.write(p.marshall());
rows.put("bundle", valueStream.toByteArray());
db.insert("tableName", null, rows);
valueStream.close();
} catch (IOException e) {
Log.e("error writing object", e.toString());
}然后在另一个活动中,我正在阅读捆绑包:
byte[] byteArray = cursor.getBlob(cursor.getColumnIndex(Base.BUNDLE));
Parcel parcel = Parcel.obtain();
parcel.unmarshall(byteArray, 0, byteArray.length);
parcel.setDataPosition(0);
Bundle bundle = Bundle.CREATOR.createFromParcel(parcel);
desc.setText(bundle.getCharSequence("key")); 在同一设备中,操作运行良好,但如果我将一个db文件带到另一个设备上,我将在读取代码时出错:
desc.setText(bundle.getCharSequence("key")); 在偏移量12处解组未知类型代码7340147
有没有人能告诉我这件事?
发布于 2016-09-15 02:45:36
Parcel类使用各种native方法来操作数据,在本例中用于存储。native基本上是指使用c/c++,它在本例中依赖于平台和体系结构,并且没有优化为各种平台提供存储结构,但它优化了在本地硬件上有效地存储数据,在本例中是您当前的设备。link to docs
因此,您的包裹存储数据可能会在其他设备上工作,也可能不会在其他设备上工作,因此如果您希望保持一致性,那么备选方案是Serializable接口或Json对象。
发布于 2016-09-15 02:33:10
然后我将其打包并保存到
中的SQlite中。
这不太可能在一台设备上工作,更不用说在多台设备上工作了。
引用the documentation for Parcel,并增加了重点:
包不是一种通用的序列化机制。该类(以及相应的用于将任意对象放入Parcel的Parcelable API )被设计为高性能的IPC传输。因此,将任何地块数据放入永久存储中是不合适的:更改地块中任何数据的底层实现可能会使较旧的数据不可读。
使用一些其他序列化机制,一种您可以控制并可以确保跨多个设备和操作系统版本工作的机制: JSON、XML、protobuf等。
https://stackoverflow.com/questions/39497222
复制相似问题