餓了麼開源專案:便捷高效的Android資料持久化儲存框架
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
Android應用開發時經常要對許多資料進行持久化儲存,便於以後訪問。
對於int、double、boolean這些基本資料,可以使用SharedPreference。對於一些物件,往SharedPreference裡儲存的時候需要使用序列化技術。如果物件很大,或者碰到列表、陣列等結構,就必須使用資料庫。而使用資料庫比較麻煩,成本比較大。
這裡介紹一個新的儲存框架,使用非常簡單,可以儲存任意物件,物件不需要實現序列化介面。上層使用快取機制,讀取資料非常高效。
專案地址:
特色
1、實現安卓裝置上的物件持久化,能儲存和讀取任何物件。
2、讀寫速度比SharedPreference等基於檔案的儲存方案高。
3、大量物件讀寫操作的場景下,使用此框架能極大提升效能,比通常的資料庫方案高效。
4、上層使用快取,讀寫資料快速高效。底層使用資料庫,在程序被終止並重新啟動後能快速恢復物件。
5、介面簡單易用,使用者無需瞭解安卓儲存機制。
6、經過嚴格測試,有良好的容錯能力和穩定性。
Gradle
dependencies {
compile 'xiaofei.library:android-data-storage:1.0.2'
}
Maven
<dependency> <groupId>xiaofei.library</groupId> <artifactId>android-data-storage</artifactId> <version>1.0.2</version> <type>pom</type> </dependency>
用法
1. 獲取介面
獲取IDataStorage介面,目前只支援資料庫型別。
IDataStorage dataStorage = DataStorageFactory.getInstance(
getApplicationContext(),
DataStorageFactory.TYPE_DATABASE);
2、儲存原理
儲存資料的時候,索引是類id和物件id。如果這兩個id相同,則老資料被覆蓋。讀取資料的時候也需要提供這兩個id。
3、類id
給需要儲存的類加上ClassId註解,裡面寫上類id。需要保證不同的類有不同的id。
如果不同版本的程式碼在混淆後,能保證該類的類名不變,那就不需要加註解。框架將類的包名和類名作為類id。
4、物件id
如果類的某個欄位就是物件id,那在那個欄位之前加上ObjectId註解。該欄位必須是String。框架將這個欄位作為物件id。
如果沒有這個欄位,那讀寫資料的時候需要提供物件id作為函式的引數。
以下給出一個例子:
@ClassId("Order")
public class Order {
@ObjectId
private String mId;
private int mState;
public int getState() {
return mState;
}
...
...
}
5、儲存資料
儲存物件order:
dataStorage.saveOrUpdate(order);
儲存一個order列表:
List<Order> list = new ArrayList<Order>();
...
dataStorage.saveOrUpdate(list);
如果Order內部沒有物件id的欄位:
dataStorage.saveOrUpdate(order, "1001");
List<Order> list = new ArrayList<Order>();
List<String> ids = new ArrayList<ids>();
...
//list和ids一一對應
dataStorage.saveOrUpdate(list, ids);
6、讀取資料
讀取一個數據
Order order = dataStorage.load(Order.class, "1001");
讀取所有Order
List<Order> list = dataStorage.loadAll(Order.class);
讀取mState為10的所有Order
List<Order> list = dataStorage.load(Order.class, new Condition() {
@Override
public boolean satisfy(Order o) {
return o.getState() == 10;
}
});
讀取一批id的Order
List<String> ids = new ArrayList<String>();
...
List<Order> list = dataStorage.load(Order.class, ids);
以上函式都有一個引數Comparator供選擇,提供Comparator後,獲取的List是經過排序的。
List<Order> list = dataStorage.loadAll(Order.class, comparator);
我還做了一個工具類,可以方便地自動生成Comparator。詳見這裡。
7、刪除資料
刪除一個數據
dataStorage.delete(order);
如果Order類裡沒有提供物件id,那麼
dataStorage.delete(Order.class, "1001");
刪除所有Order
dataStorage.deleteAll(Order.class);
刪除一批Order
List<Order> list = new ArrayList<Order>();
dataStorage.delete(list);
如果Order類裡沒有提供物件id,那麼
List<String> ids = new ArrayList<String>();
...
dataStorage.delete(Order.class, ids);
刪除mState為10的Order
dataStorage.delete(Order.class, new Condition() {
@Override
public boolean satisfy(Order o) {
return o.getState() == 10;
}
});