簡體   English   中英

如何將一個Bundle放在SQLite的blob列中?

[英]How to put a Bundle inside a blob column in SQLite?

我有這個包:

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 ,但Parcel.marshall()文檔說:

您在此處檢索的數據不得放在任何類型的持久存儲中(在本地磁盤上,通過網絡等)。 為此,您應該使用標准序列化或其他類型的通用序列化機制。 Parcel編組表示針對本地IPC進行了高度優化,因此不會嘗試保持與在不同版本的平台中創建的數據的兼容性。

簡單的序列化機制可能是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”),因此您必須確保應用程序的所有版本以相同的順序寫入和讀取相同的對象。

如果你想擁有一個鍵/值結構,你必須實現自己的輔助函數,它們在前面用一個單獨的鍵字符串寫入值,並在地圖中讀取任意數量的鍵/值對。 或者,創建您自己的可序列化對象,其中包含所需的元素(並注意此類在您的應用程序的未來版本中保持兼容):

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM