我有這個包:如何將一個Bundle放入SQLite中的blob列中?
Bundle bundle = new Bundle();
bundle.putString("u", mp); // String mp
bundle.putSerializable("m", mealplan); // String[7][6][4][5] mealplan
save.putExtra("b", bundle);
我需要把它放在一個BLOB列內,但我不知道究竟怎麼了。
我有這個包:如何將一個Bundle放入SQLite中的blob列中?
Bundle bundle = new Bundle();
bundle.putString("u", mp); // String mp
bundle.putSerializable("m", mealplan); // String[7][6][4][5] mealplan
save.putExtra("b", bundle);
我需要把它放在一個BLOB列內,但我不知道究竟怎麼了。
Bundle
對象支持Parcel
S,但Parcel.marshall()
documentation說:
您檢索這裏不得放置在任何類型的持久性存儲的數據(在本地磁盤,通過網絡等)。爲此,您應該使用標準序列化或其他類型的通用序列化機制。地塊編組表示針對本地IPC進行了高度優化,因此不會嘗試保持與在不同版本的平臺中創建的數據的兼容性。
easist序列化機制可能是JSON,它是一種可讀的文本格式。 要創建一個JSON字符串,你必須構建JSONObject
/JSONArray
對象樹:
// write
JSONObject json = new JSONObject();
json.put("u", mp);
JSONArray mealplan_json = new JSONArray();
mealplan_json.put(...); // fill arrays recursively
json.put("m", mealplan_json);
String text = json.toString();
// read
JSONObject json = new JSONObject(text);
mp = json.getString("u");
JSONArray mealplan_json = json.getJSONArray("m");
...
如果你想節省空間的二進制編碼,你必須使用序列化,它支持基本類型和正確實施java.io.Serializable任何對象:
// write
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(mp);
oos.writeObject(mealplan);
oos.close();
byte[] bytes = bos.toByteArray();
// read
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
mp = (String) ois.readObject();
mealplan = (String[][][][]) ois.readObject();
請注意,這個二進制序列不存儲任何鍵名稱(「U」,「M」),所以你必須確保你的應用程序寫入的所有版本和讀s中的相同對象ame命令。
如果你想擁有一個鍵/值結構,你必須實現你自己的幫助函數,這些函數在前面用單獨的鍵字符串編寫值,並將任意數量的鍵/值對讀入地圖。 或者,創建包含所需的元素你自己的序列化對象(和照顧這個類停留在你的應用程序的未來版本兼容):
class MealPlanData implements Serializable {
String u;
String[][][][] mp;
};
如果你只有一個Bundle
對象,不知道它的結構,你必須手動處理鍵/值:
// write
oos.writeInt(bundle.size());
for (String key : bundle.keySet()) {
Object value = bundle.get(key);
oos.writeObject(key);
oos.writeObject(value);
}
// read
int size = ios.readInt();
Map<String, Object> map = new ArrayMap<String, Object>();
for (int i = 0; i < size; i++) {
String key = (String) ios.readObject();
Object value = ios.readObject();
map.put(key, value);
}
blob接受數組字符串類型數據..像圖像數組類似的東西。我們只是爲了這個目的而使用blob。 – Saveen