如何把用戶信息存入Android SQLite數(shù)據(jù)庫耗式?
KVStorage.rxSave("user", new Gson.toJson(userInfo)).subscribe();
庫連接:https://github.com/Reone/KVStorage
一枝笨、為什么要讀這篇文章
- 你會看到用一行代碼保存用戶信息到Android數(shù)據(jù)庫
- 你會看到如何抄襲ReactNative的Android數(shù)據(jù)庫
- 你會看到Android輕量級數(shù)據(jù)庫:RxDatabase
- 你會看到基于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的四個主要文件
- AsyncLocalStorageUtil.java
- AsyncStorageErrorUtil.java
- AsyncStorageModule.java
- ReactDatabaseSupplier.java
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的形成過程
- KVStorage是僅提供Android使用的庫,所以關(guān)于類型轉(zhuǎn)換的操作不需要伴网。從文件的主要功能介紹來看蓬推,我僅保留ReactDatabaseSupplier和AsyncLocalStorageUtil即可,隨將二者合并澡腾。
- 使用數(shù)組替換ReadableArray沸伏。
- 修改方法權(quán)限,將ReactDatabaseSupplier私有动分。
- 用support注解替換javax的注解毅糟,添加修改一些注解。
- 使用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ā)...