SQLite是一款廣泛用於嵌入式設備上的輕量級關係型數據庫,而在安卓設備的數據存儲上更是有舉足輕重的位置,所以SQLite的基本操作是每個安卓開發者必須掌握的技能。而它操作與用法在網上已經有大量的資料,博客可以參考,以這裏我也不老生常談,直接進入主題——SQLite泛型對象操作。
我們在做開發寫代碼的時候,很大可能會用到javabean來進行對象屬性的操作,當我們需要把一個對象的所有屬性寫入數據庫時,通常方法是getXXX()獲取屬性值後再進行數據的存儲操作,但是如果這個對象屬性很多的話,那麼用這種方法將是一種很累人的方式,並且會大大的增加不必要的代碼,那麼就會想到要是可以直接把對象進行存儲到數據庫就好了,那麼這個當然是可以實現,就是把對象進行系列化,系列化之後再進行存儲。一步到位!同時,爲了適應所有不同的對象,這裏把它定義成泛型對象,從此不管什麼bean,都可以直接進行簡單的調用,即可完成存儲。
下面是主要代碼:
/**
* 保存數據
*
* @param obj
*/
public void saveObj(T obj) {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);
objectOutputStream.writeObject(obj);
objectOutputStream.flush();
byte data[] = arrayOutputStream.toByteArray();
objectOutputStream.close();
arrayOutputStream.close();
SQLiteDatabase database = this.getWritableDatabase();
database.execSQL("insert into "+tableName+" ("+column+") values(?)",
new Object[] { data });
database.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取數據list
*
*/
@SuppressWarnings("unchecked")
public ArrayList<T> getAllObj() {
ArrayList<T> objs = new ArrayList<T>();
SQLiteDatabase database = this.getReadableDatabase();
Cursor cursor = database.rawQuery("select * from "+tableName, null);
if (cursor != null) {
while (cursor.moveToNext()) {
idList.add(Integer.toString(cursor.getInt(0)));
byte data[] = cursor.getBlob(cursor.getColumnIndex(column));
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(data);
try {
ObjectInputStream inputStream = new ObjectInputStream(
arrayInputStream);
T obj = (T) inputStream.readObject();
objs.add(obj);
inputStream.close();
arrayInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return objs;
}
調用:
db = new DBServices<Song>(this,tableName);//實例
songs = db.getAllObj();//獲取所有的對象List
db.saveObj(song);//存儲某個對象
其他操作也跟正常的SQLite操作一樣,例如刪除數據庫表中id爲1的對象
則:db.delete(tableName , "id=?", new String[] {“1”}); 即可。