2013年4月18日星期四

Android將物件存入Sqlite


某些時候需要儲存一個物件,而且這個物件不是簡單的文字或數字,
可以儲存到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呢?

加油吧!!




没有评论:

发表评论