RxPersistence基於面向對象設計的快速持久化框架

RxPersistence是基於面向對象設計的快速持久化框架,目的是爲了簡化SharePreferences及本地緩存Cache的使用,減少代碼的編寫。可以非常快速地保存基本類型和對象。RxPersistence是基於APT技術實現,在編譯期間實現代碼的生成,支持混淆。根據不同的用戶區分持久化信息。

特點

  1. 把通過的Javabean變成SharedPreferences操作類
  2. 把通過的Javabean變成Cache操作類
  3. 支持保存基本類型及對象
  4. 支持根據不同的用戶區分持久化信息
  5. 支持Rxjava
  6. 可支持自定義緩存方式,如內存緩存,磁盤緩存及二級緩存

簡單例子

定義javabean類
@CacheEntity(mode = CacheMode.MEMORY,global = true, memoryMaxCount = 300,diskMaxSize = 400)
public class UserTest {
    @CacheField(saveTime = 200,save = true)
    private String name;
    @CacheField(save = true)
    private double num;
    private int age;
    private Bitmap bitmap;
    private Drawable drawable;
    private List<String> list;
    @CacheField(saveTime = 200,save = true)
	
	
	@SPEntity(global = false)
public class UserProfile {
    @SPField(commit = true,save = true)    
    private String name;
    @SPField(commit = true,save = true,global = false)
    private double num;
    private int age;
使用方式
//初始化
    RxPersistence.init(this, new PersistenceParser() {
            @Override
            public Object deserialize(Type clazz, String text) {
                return new Gson().fromJson(text,clazz);
            }

            @Override
            public String serialize(Object object) {
                return new Gson().toJson(object);
            }
        });
	RxPersistence.setUserGroups("用戶組ID");//可選配置
    RxPersistence.setUserTokens("用戶ID");//可選配置
// 保存信息
UserTestMemoryCache.get().setName()
 
UserProfileSP.get().setAge();
UserProfileSP.get().setAgeRx();
// 獲取信息

 UserTestMemoryCache.get().getName()
 
UserProfileSP.get().getAge();
UserProfileSP.get().getAgeRx();

從上面的簡單例子可以看到,我們需要做SharePreferences持久化,僅僅定義一個簡單的javabean類(UserProfileSP)並添加註解即可,這個框架會根據javabean生成帶有持久化功能的UserProfile 類,通過這個類就可以非常簡單去保持或者獲取數據,大大簡化了SharePreferences的使用,也可以保持對象。

項目地址

https://github.com/TanZhiL/RxPersistence

一、配置項目

配置項目根目錄 build.gradle
allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}
配置app build.gradle
apply plugin: 'com.android.application'


//...
dependencies {
     implementation 'com.github.TanZhiL.RxPersistence:rxpersistence:0.0.5'
    annotationProcessor 'com.github.TanZhiL.RxPersistence:rxpersistence-compiler:0.0.5'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
}

二、定義持久化Javabean

使用方法非常簡單,先編寫一個普通帶getter、setter的javabean類,在類頭部添加@SPEntity或者@CacheEntity:

//Sharepreference
	@SPEntity(global = false)
public class UserProfile {
    @SPField(commit = true,save = true)    
    private String name;
    @SPField(commit = true,save = true,global = false)
    private double num;
    private int age;
    // ...

    // get、set方法必須寫
}
//Cache
@CacheEntity(mode = CacheMode.MEMORY,global = true, memoryMaxCount = 300,diskMaxSize = 400)
public class UserTest {
    @CacheField(saveTime = 200,save = true)
    private String name;
    @CacheField(save = true)
    private double num;
    private int age;
    private Bitmap bitmap;
    private Drawable drawable;

三、註解及使用說明

請參考註解註釋,及simple

四、初始化

使用之前要進行初始化,建議在Application進行初始化,需要需要保存對象,還需要實現對象的解析器,這裏使用Gson作爲實例:


//初始化
    RxPersistence.init(this, new PersistenceParser() {
            @Override
            public Object deserialize(Type clazz, String text) {
                return new Gson().fromJson(text,clazz);
            }

            @Override
            public String serialize(Object object) {
                return new Gson().toJson(object);
            }
        });
	RxPersistence.setUserGroups("用戶組ID");//可選配置
    RxPersistence.setUserTokens("用戶ID");//可選配置

五、根據不同的用戶設置

如果app支持多用戶登錄,需要根據不用的用戶持久化,可以通過下面方法配置。再通過@SPField(global = false),就可以針對某個字段跟隨用戶不同進行持久化。

	RxPersistence.setUserGroups("用戶組ID");//可選配置
    RxPersistence.setUserTokens("用戶ID");//可選配置

六、代碼調用


// 普通類型保存
SettingsPreferences.get().setUseLanguage("zh");
SettingsPreferences.get().setLastOpenAppTimeMillis(System.currentTimeMillis());
// 對象類型保存
Settings.LoginUser loginUser = new Settings.LoginUser();
loginUser.setUsername("username");
loginUser.setPassword("password");
SettingsPreferences.get().setLoginUser(loginUser);


// 獲取
String useLanguage = settingsPreference.getUseLanguage();
Settings.LoginUser loginUser1 = settingsPreference.getLoginUser();
boolean openPush = settingsPreference.getPush().isOpenPush();

七、默認值

很多時候我們需要在沒有獲取到值時使用默認值,SharedPreferences本身也是具備默認值的,所以我們也是支持默認值配置。分析生成的代碼可以看到:


@Override
public long getLastOpenAppTimeMillis() {
   return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());
}

如果沒有獲取到值,會調用父類的方法,那麼就可以通過這個方式配置默認值:


@SPEntity
public class Settings {
   // 使用commit提交,默認是使用apply提交,配置默認值
   @SPField(commit = true)
   private String useLanguage = "zh";

   // ...

}

致謝

  • 感謝所有開源庫的大佬
  • https://github.com/Blankj/AndroidUtilCode
  • https://github.com/taoweiji/AptPreferences

問題反饋

歡迎加星,打call https://github.com/TanZhiL/RxPersistence

關於作者

譚志龍

開源項目

License

Copyright 2019 Thomas, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章