某些時候需要儲存一個物件,而且這個物件不是簡單的文字或數字,
可以儲存到Sqlite嗎?答案是可以的。
1.
首先是Sqlite的table建立
EX:
CREATE TABLE MyTest('id' INTEGER PRIMARY KEY, object BLOB);
2.
implements Serializable
Ex:
public MyObject mplements Serializable{
}
3.
儲存:
ContentValues values = new ContentValues();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(myObject);
byte[] bytes = baos.toByteArray();
values.put("object", bytes);
out.close();
baos.close();
resolver.insert(MyTest.CONTENT_URI, values);
光是這樣就可以將物件存到DB了,但如果要讀出來呢?
4.讀取
Cursor c = resolver.query(MyTest.CONTENT_URI,new String[] { "id","object" },null,null, null);
while (c.moveToNext()) {
ObjectInputStream objectIn = null;
try {
objectIn = new ObjectInputStream( new ByteArrayInputStream( c.getBlob(1)));
MyObject myObject = (MyObject) objectIn.readObject();
}catch (Exception ex) {
ex.printStackTrace();
} finally {
if (null != objectIn) {
objectIn.close();
}
}
這樣就可以將物件還原了
...本來是這樣就可以了,但後來發現,程式雖然不會有問題,
但還原回來的物件和存進去的物件有差別,所以有一點要注意的:
要被儲存進Sqlite的物件必須是implements Serializable,舉例來說:
我的MyObject有二個子物件,一個是HashMap,一個是Activity,
這樣子的話,儲進Sqlite的只有HashMap,因為HashMap有implements Serializable,
所以取出來的就只有HashMap。
建議:
1.
繼承將想儲入的Object,implements Serializable,而裡面的類別如果有特別情況需儲入資料庫的,也是繼承Object,,implements Serializable。
2.
在MyObject中建立一段程式碼如下:
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
in.defaultReadObject();
initial();
}
這一段程式碼在讀取的程式碼中會被呼叫,
即 MyObject myObject = (MyObject) objectIn.readObject();
這個時候,這一段程式碼就會被呼叫了,在這個時間點,
物件(MyObject)內的有實作Serializable的變數都會被還原回來,
此時可以利用initial() method,初始化想做的事情。
很複雜對不對...誰叫你想把物件放入Sqlite呢?
加油吧!!
没有评论:
发表评论