KVStorage:小巧強(qiáng)大的輕量級Android-仿NoSQL數(shù)據(jù)庫實(shí)現(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ù)庫實(shí)現(xiàn)

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

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

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

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

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

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

3.為什么用RxJava替換AsynTask?

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

4.KVStorage有多輕?

其實(shí)庫中只有一個java文件堤器,標(biāo)準(zhǔn)格式昆庇,代碼不超過400行。

三闸溃、從抄襲ReactNative到KVStorage

1.定位目標(biāo)

1.RN保存數(shù)據(jù)時(shí)使用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.找到項(xiàng)目中RN庫中對應(yīng)的文件 AsyncStorageModule.java

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

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

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

  • AsyncLocalStorageUtil.java

提供了保存、合并保存與查找的同步實(shí)現(xiàn)辉川,提供了SQL查詢語句的構(gòu)建工具表蝙。

  • AsyncStorageErrorUtil.java

    當(dāng)操作出現(xiàn)錯誤時(shí),用以構(gòu)建可供js使用的錯誤信息乓旗。

  • AsyncStorageModule.java

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

  • ReactDatabaseSupplier.java

    繼承SQLiteOpenHelper屿愚,實(shí)現(xiàn)了數(shù)據(jù)庫創(chuàng)建汇跨、更新务荆、關(guān)閉、設(shè)置最大值的功能穷遂。提供SQLiteDatabase的獲取方法蛹含。

  • ReadableArray.java

    js數(shù)據(jù)與java數(shù)據(jù)的適配類型∪洌可以使java接受js參數(shù)浦箱。

  • WritableMap.java

    js數(shù)據(jù)與java數(shù)據(jù)的適配類型§袈啵可以使js接受java參數(shù)酷窥。

3.KVStorage的形成過程

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

四姆另、KVStorage正式介紹

a simple easy NoSQL database

  • 一個簡單的容易使用的數(shù)據(jù)庫
  • 僅一個文件400行java代碼
  • 非關(guān)系型Key-value數(shù)據(jù)庫
  • 底層使用sqlite實(shí)現(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.使用方式

詳細(xì)的使用可以查看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ā)...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坟乾,一起剝皮案震驚了整個濱河市迹辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甚侣,老刑警劉巖明吩,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殷费,居然都是意外死亡印荔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門宗兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏鱼,“玉大人,你說我怎么就攤上這事殷绍∪究粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茶行。 經(jīng)常有香客問我躯概,道長,這世上最難降的妖魔是什么畔师? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任娶靡,我火速辦了婚禮,結(jié)果婚禮上看锉,老公的妹妹穿的比我還像新娘姿锭。我一直安慰自己,他們只是感情好伯铣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布呻此。 她就那樣靜靜地躺著,像睡著了一般腔寡。 火紅的嫁衣襯著肌膚如雪焚鲜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天放前,我揣著相機(jī)與錄音忿磅,去河邊找鬼。 笑死凭语,一個胖子當(dāng)著我的面吹牛葱她,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叽粹,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼览效,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虫几?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挽拔,失蹤者是張志新(化名)和其女友劉穎辆脸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃诅,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啡氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了术裸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倘是。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袭艺,靈堂內(nèi)的尸體忽然破棺而出搀崭,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布瘤睹,位于F島的核電站升敲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轰传。R本人自食惡果不足惜驴党,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获茬。 院中可真熱鬧港庄,春花似錦、人聲如沸恕曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽码俩。三九已至度帮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稿存,已是汗流浹背笨篷。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣履,地道東北人率翅。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像袖迎,于是被迫代替她去往敵國和親冕臭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容