KVStorage:小巧強大的輕量級Android-仿NoSQL數(shù)據(jù)庫實現(xiàn)

如何把用戶信息存入Android SQLite數(shù)據(jù)庫?
KVStorage.rxSave("user", new Gson.toJson(userInfo)).subscribe();

庫連接:https://github.com/Reone/KVStorage

一、為什么要讀這篇文章

  1. 你會看到用一行代碼保存用戶信息到Android數(shù)據(jù)庫
  2. 你會看到如何抄襲ReactNative的Android數(shù)據(jù)庫
  3. 你會看到Android輕量級數(shù)據(jù)庫:RxDatabase
  4. 你會看到基于Android SQLite的NoSQL數(shù)據(jù)庫實現(xiàn)

二、依賴KVStorage之前你可能會有的問題

1.Key-Value存取為什么不使用SharedPreference?

SharedPreference不適合大數(shù)據(jù)的存儲,具體原因可以查找資料,不要濫用SharedPreference
這里簡單的列幾個比較嚴重的問題:

  • 第一次從sp中獲取值的時候,有可能阻塞主線程,使界面卡頓、掉幀。
  • 解析sp的時候會產(chǎn)生大量的臨時對象,導致頻繁GC,引起界面卡頓。
  • 被SharedPreferences加載進來的這些大對象,會永遠存在于內(nèi)存之中,不會被釋放.
  • SharedPreferences是線程不安全的。

2.什么叫NoSQL數(shù)據(jù)庫?NoSQL數(shù)據(jù)庫有什么優(yōu)勢?

NoSQL,泛指非關系型的數(shù)據(jù)庫。KVStorage屬于鍵值(Key-Value)存儲數(shù)據(jù)庫。注意KVStorage并不完全屬于NoSQL,其底層由sqlite實現(xiàn)。

3.為什么用RxJava替換AsynTask?

除了RxJava人盡皆知的可讀性好之外,還有便于生命周期管理等優(yōu)勢,更多優(yōu)勢可查閱用RxJava.Observable取代AsyncTask和AsyncTaskLoader-RxJava Android模版

4.KVStorage有多輕?

其實庫中只有一個java文件,標準格式,代碼不超過400行。

三、從抄襲ReactNative到KVStorage

1.定位目標

1.RN保存數(shù)據(jù)時使用setItem方法,可以定位到 AsyncStorage.js

setItem: function(
    key: string,
    value: string,
    callback?: ?(error: ?Error) => void
  ): Promise {
    return new Promise((resolve, reject) => {
      RCTAsyncStorage.multiSet([[key,value]], function(errors) {
        var errs = convertErrors(errors);
        callback && callback(errs && errs[0]);
        if (errs) {
          reject(errs[0]);
        } else {
          resolve(null);
        }
      });
    });
  },

異步調(diào)用了RCTAsyncStorage.multiSet

2.找到項目中RN庫中對應的文件 AsyncStorageModule.java

AsyncStorageModule.multiSet(final ReadableArray keyValueArray, final Callback callback)

3.根據(jù)關聯(lián)找到RN源碼庫中關于RN storage的四個主要文件

2.RN Storage主要文件功能介紹

  • AsyncLocalStorageUtil.java

提供了保存、合并保存與查找的同步實現(xiàn),提供了SQL查詢語句的構建工具。

  • AsyncStorageErrorUtil.java

    當操作出現(xiàn)錯誤時,用以構建可供js使用的錯誤信息。

  • AsyncStorageModule.java

    js代碼映射的java文件,提供js使用的數(shù)據(jù)庫操作方法。

  • ReactDatabaseSupplier.java

    繼承SQLiteOpenHelper,實現(xiàn)了數(shù)據(jù)庫創(chuàng)建、更新、關閉、設置最大值的功能。提供SQLiteDatabase的獲取方法。

  • ReadableArray.java

    js數(shù)據(jù)與java數(shù)據(jù)的適配類型??梢允筳ava接受js參數(shù)。

  • WritableMap.java

    js數(shù)據(jù)與java數(shù)據(jù)的適配類型??梢允筳s接受java參數(shù)。

3.KVStorage的形成過程

  1. KVStorage是僅提供Android使用的庫,所以關于類型轉(zhuǎn)換的操作不需要。從文件的主要功能介紹來看,我僅保留ReactDatabaseSupplier和AsyncLocalStorageUtil即可,隨將二者合并。
  2. 使用數(shù)組替換ReadableArray。
  3. 修改方法權限,將ReactDatabaseSupplier私有。
  4. 用support注解替換javax的注解,添加修改一些注解。
  5. 使用rxJava代替AsynTask實現(xiàn)異步操作。

四、KVStorage正式介紹

a simple easy NoSQL database

  • 一個簡單的容易使用的數(shù)據(jù)庫
  • 僅一個文件400行java代碼
  • 非關系型Key-value數(shù)據(jù)庫
  • 底層使用sqlite實現(xiàn)

1.使用環(huán)境

  • java8
  • rxJava
  • rxAndroid

2.引用,添加依賴

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.Reone:KVStorage:v1.0.1'
}

3.KVStorage依賴說明

dependencies {
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation "io.reactivex.rxjava2:rxjava:2.1.5"
    implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
}

4.使用方式

詳細的使用可以查看SimpleActivity

  • 在Application中初始化
KVStorage.init(context);
  • 保存
KVStorage.rxSave(demoKey, demoValue).subscribe();
  • 查找
KVStorage.rxGet(demoKey)
         .subscribe(new AsyncObserver<String>() {
             @Override
             public void onSuccess(String result) {
                 
             }

             @Override
             public void onError(Throwable e) {
                 
             }
         });
  • 刪除/批量刪除
KVStorage.rxRemove(demoKey).subscribe();
KVStorage.rxRemove(demoKey1,demoKey2).subscribe();

5.功能接口

  • 異步保存
  • 同步保存
  • 異步獲取
  • 異步刪除
  • 獲取所有key
  • 清除所有key
  • 合并保存json
  • 待開發(fā)...
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容