1. 程式人生 > >餓了麼開源專案:便捷高效的Android資料持久化儲存框架

餓了麼開源專案:便捷高效的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;
                     }
                   });

8、其他API