輕量級數(shù)據(jù)存儲概述
輕量級數(shù)據(jù)存儲適用于對Key-Value結(jié)構(gòu)的數(shù)據(jù)進(jìn)行存取和持久化操作。應(yīng)用獲取某個輕量級存儲對象后,該存儲對象中的數(shù)據(jù)將會被緩存在內(nèi)存中,以便應(yīng)用獲得更快的數(shù)據(jù)存取速度。應(yīng)用也可以將緩存的數(shù)據(jù)再次寫回文本文件中進(jìn)行持久化存儲,由于文件讀寫將產(chǎn)生不可避免的系統(tǒng)資源開銷,建議應(yīng)用減少對持久化文件的讀寫頻率。
基本概念
-
Key-Value數(shù)據(jù)結(jié)構(gòu)
一種鍵值結(jié)構(gòu)數(shù)據(jù)類型。Key是不重復(fù)的關(guān)鍵字,Value是數(shù)據(jù)值。
-
非關(guān)系型數(shù)據(jù)庫
區(qū)別于關(guān)系數(shù)據(jù)庫,不保證遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用關(guān)系模型來組織數(shù)據(jù),數(shù)據(jù)之間無關(guān)系。
運(yùn)作機(jī)制
- 應(yīng)用通過指定Preferences文件將其中的數(shù)據(jù)加載到Preferences實(shí)例,系統(tǒng)會通過靜態(tài)容器將該實(shí)例存儲在內(nèi)存中,同一應(yīng)用或進(jìn)程中每個文件僅存在一個Preferences實(shí)例,直到應(yīng)用主動從內(nèi)存中移除該實(shí)例或者刪除該P(yáng)references文件。
- 應(yīng)用獲取到Preferences文件對應(yīng)的實(shí)例后,可以從Preferences實(shí)例中讀取數(shù)據(jù),或者將數(shù)據(jù)存入Preferences實(shí)例中。通過調(diào)用flush或者flushSync方法可以將Preferences實(shí)例中的數(shù)據(jù)回寫到文件里。
圖1?輕量級數(shù)據(jù)存儲運(yùn)作機(jī)制
?
約束與限制
- 因Preferences實(shí)例會加載到內(nèi)存中,建議存儲的數(shù)據(jù)不超過一萬條,并及時清理不再使用的實(shí)例,以便減少非內(nèi)存開銷。
- 數(shù)據(jù)中的key為string類型,要求非空且字符長度不超過80個。
- 當(dāng)數(shù)據(jù)中的value為string類型時,允許為空,字符長度不超過8192個。
- 當(dāng)value值為字符串型Set集合類型時,要求集合元素非空且字符長度不超過8192個。
輕量級數(shù)據(jù)存儲開發(fā)
場景介紹
輕量級數(shù)據(jù)存儲功能通常用于保存應(yīng)用的一些常用配置信息,并不適合需要存儲大量數(shù)據(jù)和頻繁改變數(shù)據(jù)的場景。應(yīng)用的數(shù)據(jù)保存在文件中,這些文件可以持久化地存儲在設(shè)備上。需要注意的是,應(yīng)用訪問的實(shí)例包含文件所有數(shù)據(jù),這些數(shù)據(jù)會一直加載在設(shè)備的內(nèi)存中,直到應(yīng)用主動從內(nèi)存中將其移除前,應(yīng)用可以通過Preferences的API進(jìn)行數(shù)據(jù)操作。
接口說明
輕量級存儲為應(yīng)用提供key-value鍵值型的文件數(shù)據(jù)處理能力,支持應(yīng)用對數(shù)據(jù)進(jìn)行輕量級存儲及查詢。數(shù)據(jù)存儲形式為鍵值對,鍵的類型為字符串型,值的存儲數(shù)據(jù)類型包括整型、字符串型、布爾型、浮點(diǎn)型、長整型、字符串型Set集合。
創(chuàng)建存儲實(shí)例
讀取指定文件,將數(shù)據(jù)加載到Preferences實(shí)例,即可創(chuàng)建一個存儲實(shí)例,用于數(shù)據(jù)操作。
類名 |
接口名 |
描述 |
---|---|---|
DatabaseHelper |
DatabaseHelper(Context context) |
DatabaseHelper是數(shù)據(jù)操作的輔助類。 |
DatabaseHelper |
Preferences getPreferences(String name) |
獲取數(shù)據(jù)存儲文件對應(yīng)的Preferences單實(shí)例,用于數(shù)據(jù)操作。數(shù)據(jù)文件存放在由上下文指定的目錄里,該路徑會因指定不同的上下文存在差異。 |
存入數(shù)據(jù)
通過Put系列方法,可以增加或修改Preferences實(shí)例中的數(shù)據(jù)。
類名 |
接口名 |
描述 |
---|---|---|
Preferences |
Preferences putInt(String key, int value) |
設(shè)置Preferences實(shí)例中鍵對應(yīng)的int類型的值。 |
Preferences |
Preferences putString(String key, String value) |
設(shè)置Preferences實(shí)例中鍵對應(yīng)的String類型的值。 |
讀取數(shù)據(jù)
通過調(diào)用Get系列方法,可以讀取Preferences中的數(shù)據(jù)。
類名 |
接口名 |
描述 |
---|---|---|
Preferences |
int getInt(String key, int defValue) |
獲取鍵對應(yīng)的int類型的值。 |
Preferences |
float getFloat(String key, float defValue) |
獲取鍵對應(yīng)的float類型的值。 |
數(shù)據(jù)持久化
通過執(zhí)行flush方法,應(yīng)用可以將緩存的數(shù)據(jù)再次寫回文本文件中進(jìn)行持久化存儲。
類名 |
接口名 |
描述 |
---|---|---|
Preferences |
void flush() |
將Preferences實(shí)例異步寫入文件。 |
Preferences |
boolean flushSync() |
將Preferences實(shí)例同步寫入文件。 |
訂閱數(shù)據(jù)變化
訂閱數(shù)據(jù)變化需要指定PreferencesObserver作為回調(diào)方法。訂閱的key的值發(fā)生變更后,當(dāng)執(zhí)行flush方法時,PreferencesObserver被回調(diào)。
類名 |
接口名 |
描述 |
---|---|---|
Preferences |
void registerObserver(PreferencesObserver preferencesObserver) |
訂閱數(shù)據(jù)變化。 |
Preferences |
void unRegisterObserver(PreferencesObserver preferencesObserver) |
注銷訂閱。 |
Preferences.PreferencesObserver |
void onChange(Preferences preferences, String key) |
訂閱者的回調(diào)方法,數(shù)據(jù)變化會觸發(fā)回調(diào)該方法。 |
刪除數(shù)據(jù)文件
通過調(diào)用以下兩種接口,可以刪除數(shù)據(jù)實(shí)例或?qū)?yīng)的文件。
類名 |
接口名 |
描述 |
---|---|---|
DatabaseHelper |
boolean deletePreferences(String name) |
將Preferences實(shí)例從內(nèi)存中移除,同時刪除其在設(shè)備上的持久化文件。 |
DatabaseHelper |
void removePreferencesFromCache(String name) |
僅將Preferences實(shí)例從內(nèi)存中移除。 |
移動數(shù)據(jù)文件
類名 |
接口名 |
描述 |
---|---|---|
DatabaseHelper |
boolean movePreferences(Context sourceContext, String sourceName, String targetName) |
移動數(shù)據(jù)持久化文件。 |
開發(fā)步驟
獲取Preferences實(shí)例。
讀取指定文件,將數(shù)據(jù)加載到Preferences實(shí)例,用于數(shù)據(jù)操作。
Context context = getContext(); // 數(shù)據(jù)文件存儲路徑:/data/data/{PackageName}/{AbilityName}/preferences。
// Context context = getApplicationContext(); // 數(shù)據(jù)文件存儲路徑:/data/data/{PackageName}/preferences。
DatabaseHelper databaseHelper = new DatabaseHelper(context); // context入?yún)㈩愋蜑閛hos.app.Context。
String fileName = "test_pref"; // fileName表示文件名,其取值不能為空,也不能包含路徑,默認(rèn)存儲目錄可以通過context.getPreferencesDir()獲取。
Preferences preferences = databaseHelper.getPreferences(fileName);
讀取數(shù)據(jù)。
使用Preferences get方法讀取數(shù)據(jù)。
preferences.putInt("intKey", 3);
preferences.putString("StringKey", "String value");
數(shù)據(jù)持久化。
應(yīng)用存入數(shù)據(jù)到Preferences實(shí)例后,可以通過flush或者flushSync方法將Preferences實(shí)例回寫到文件中。
preferences.flush(); // 異步方法
bool result = preferences.flushSync(); // 同步方法
訂閱數(shù)據(jù)變化。
應(yīng)用訂閱數(shù)據(jù)變化需要指定PreferencesObserver作為回調(diào)方法。訂閱的key的值發(fā)生變更后,當(dāng)執(zhí)行flush方法時,PreferencesObserver被觸發(fā)回調(diào)。不再需要PreferencesObserver時請注銷。
private class PreferencesObserverImpl implements Preferences.PreferencesObserver {
@Override
public void onChange(Preferences preferences, String key) {
if ("intKey".equals(key)) {
HiLog.info(LABLE, "Change Received:[key=value]");
}
}
}
// 訂閱數(shù)據(jù)變化
PreferencesObserverImpl observer = new PreferencesObserverImpl();
preferences.registerObserver(observer);
// 修改數(shù)據(jù)
preferences.putInt("intKey", 3);
// 觸發(fā)訂閱者回調(diào)方法執(zhí)行
preferences.flush();
// 修改數(shù)據(jù)后,observer的onChange方法會被回調(diào)
// 注銷訂閱
preferences.unRegisterObserver(observer);
移除Preferences實(shí)例。
從內(nèi)存中移除指定文件對應(yīng)的Preferences單實(shí)例。移除Preferences單實(shí)例時,應(yīng)用不允許再使用該實(shí)例進(jìn)行數(shù)據(jù)操作,否則會出現(xiàn)數(shù)據(jù)一致性問題。
DatabaseHelper databaseHelper = new DatabaseHelper(context);
String fileName = "name"; // fileName表示文件名,其取值不能為空,也不能包含路徑。
databaseHelper.removePreferencesFromCache(fileName);
刪除指定文件。
使用deletePreferences方法從內(nèi)存中移除指定文件對應(yīng)的Preferences單實(shí)例,并刪除指定文件及其備份文件、損壞文件。刪除指定文件時,應(yīng)用不允許再使用該實(shí)例進(jìn)行數(shù)據(jù)操作,否則會出現(xiàn)數(shù)據(jù)一致性問題。刪除后,數(shù)據(jù)及文件將不可恢復(fù)。
DatabaseHelper databaseHelper = new DatabaseHelper(context);
String fileName = "name"; // fileName表示文件名,其取值不能為空,也不能包含路徑。
boolean result = databaseHelper.deletePreferences(fileName);
移動指定文件。文章來源:http://www.zghlxwxcb.cn/news/detail-540172.html
從源路徑移動文件到目標(biāo)路徑。移動文件時,應(yīng)用不允許再操作該文件數(shù)據(jù),否則會出現(xiàn)數(shù)據(jù)一致性問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-540172.html
Context targetContext = getContext();
DatabaseHelper databaseHelper = new DatabaseHelper(targetContext);
String srcFile = "srcFile"; // srcFile表示源文件名或者源文件的絕對路徑,不能為相對路徑,其取值不能為空。當(dāng)srcFile只傳入文件名時,srcContext不能為空。
String targetFile = "targetFile"; // targetFile表示目標(biāo)文件名,其取值不能為空,也不能包含路徑。
Context srcContext = getApplicationContext();
boolean result = databaseHelper.movePreferences(srcContext, srcFile, targetFile);
到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之開發(fā)篇—數(shù)據(jù)管理(輕量級數(shù)據(jù)存儲)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!