W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前兩個(gè)小節(jié)介紹的LocalStorage和AppStorage都是運(yùn)行時(shí)的內(nèi)存,但是在應(yīng)用退出再次啟動(dòng)后,依然能保存選定的結(jié)果,是應(yīng)用開發(fā)中十分常見的現(xiàn)象,這就需要用到PersistentStorage。
PersistentStorage是應(yīng)用程序中的可選單例對(duì)象。此對(duì)象的作用是持久化存儲(chǔ)選定的AppStorage屬性,以確保這些屬性在應(yīng)用程序重新啟動(dòng)時(shí)的值與應(yīng)用程序關(guān)閉時(shí)的值相同。
PersistentStorage將選定的AppStorage屬性保留在設(shè)備磁盤上。應(yīng)用程序通過API,以決定哪些AppStorage屬性應(yīng)借助PersistentStorage持久化。UI和業(yè)務(wù)邏輯不直接訪問PersistentStorage中的屬性,所有屬性訪問都是對(duì)AppStorage的訪問,AppStorage中的更改會(huì)自動(dòng)同步到PersistentStorage。
PersistentStorage和AppStorage中的屬性建立雙向同步。應(yīng)用開發(fā)通常通過AppStorage訪問PersistentStorage,另外還有一些接口可以用于管理持久化屬性,但是業(yè)務(wù)邏輯始終是通過AppStorage獲取和設(shè)置屬性的。
PersistentStorage允許的類型和值有:
PersistentStorage不允許的類型和值有:
持久化數(shù)據(jù)是一個(gè)相對(duì)緩慢的操作,應(yīng)用程序應(yīng)避免以下情況:
PersistentStorage的持久化變量最好是小于2kb的數(shù)據(jù),不要大量的數(shù)據(jù)持久化,因?yàn)镻ersistentStorage寫入磁盤的操作是同步的,大量的數(shù)據(jù)本地化讀寫會(huì)同步在UI線程中執(zhí)行,影響UI渲染性能。如果開發(fā)者需要存儲(chǔ)大量的數(shù)據(jù),建議使用數(shù)據(jù)庫(kù)api。
PersistentStorage只能在UI頁面內(nèi)使用,否則將無法持久化數(shù)據(jù)。
static PersistProp<T>(key: string, defaultValue: T): void
將AppStorage中key對(duì)應(yīng)的屬性持久化到文件中。該接口的調(diào)用通常在訪問AppStorage之前。
確定屬性的類型和值的順序如下:
根據(jù)上述的初始化流程,如果AppStorage中有該屬性,則會(huì)使用其值,覆蓋掉PersistentStorage文件中的值。由于AppStorage是內(nèi)存內(nèi)數(shù)據(jù),該行為會(huì)導(dǎo)致數(shù)據(jù)喪失持久化能力。
參數(shù):
參數(shù)名 | 類型 | 必填 | 參數(shù)描述 |
---|---|---|---|
key | string | 是 | 屬性名。 |
defaultValue | T | 是 | 在PersistentStorage和AppStorage未查詢到時(shí),則使用默認(rèn)值初始化初始化它。不允許為undefined和null。 |
示例:
- PersistentStorage.PersistProp('highScore', '0');
static DeleteProp(key: string): void
將key對(duì)應(yīng)的屬性從PersistentStorage刪除,后續(xù)AppStorage的操作,對(duì)PersistentStorage不會(huì)再有影響。
參數(shù):
參數(shù)名 | 類型 | 必填 | 參數(shù)描述 |
---|---|---|---|
key | string | 是 | PersistentStorage中的屬性名。 |
示例:
- PersistentStorage.DeleteProp('highScore');
static PersistProps(properties: {key: string, defaultValue: any;}[]): void
行為和PersistProp類似,不同在于可以一次性持久化多個(gè)數(shù)據(jù),適合在應(yīng)用啟動(dòng)的時(shí)候初始化。
參數(shù):
參數(shù)名 | 類型 | 必填 | 參數(shù)描述 |
---|---|---|---|
key | string | 是 | 屬性名。 |
properties | {key: string, defaultValue: any}[] | 是 | 持久化數(shù)組,啟動(dòng)key為屬性名,defaultValue為默認(rèn)值。規(guī)則同PersistProp。 |
示例:
- PersistentStorage.PersistProps([{ key: 'highScore', defaultValue: '0' }, { key: 'wightScore', defaultValue: '1' }]);
static Keys(): Array<string>
返回所有持久化屬性的key的數(shù)組。
返回值:
類型 | 描述 |
---|---|
Array<string> | 返回所有持久化屬性的key的數(shù)組。 |
示例:
- let keys: Array<string> = PersistentStorage.Keys();
- PersistentStorage.PersistProp('aProp', 47);
- AppStorage.Get('aProp'); // returns 47
或在組件內(nèi)部定義:
- @StorageLink('aProp') aProp: number = 48;
完整代碼如下:
- PersistentStorage.PersistProp('aProp', 47);
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World'
- @StorageLink('aProp') aProp: number = 48
- build() {
- Row() {
- Column() {
- Text(this.message)
- // 應(yīng)用退出時(shí)會(huì)保存當(dāng)前結(jié)果。重新啟動(dòng)后,會(huì)顯示上一次的保存結(jié)果
- Text(`${this.aProp}`)
- .onClick(() => {
- this.aProp += 1;
- })
- }
- }
- }
- }
當(dāng)前持久化存儲(chǔ)在API9模擬器上暫不支持。
該示例為反例。在調(diào)用PersistentStorage.PersistProp或者PersistProps之前使用接口訪問AppStorage中的屬性是錯(cuò)誤的,因?yàn)檫@樣的調(diào)用順序會(huì)丟失上一次應(yīng)用程序運(yùn)行中的屬性值:
- let aProp = AppStorage.SetOrCreate('aProp', 47);
- PersistentStorage.PersistProp('aProp', 48);
應(yīng)用在非首次運(yùn)行時(shí),先執(zhí)行AppStorage.SetOrCreate('aProp', 47):屬性“aProp”在AppStorage中創(chuàng)建,其類型為number,其值設(shè)置為指定的默認(rèn)值47。'aProp'是持久化的屬性,所以會(huì)被寫回PersistentStorage磁盤中,PersistentStorage存儲(chǔ)的上次退出應(yīng)用的值丟失。
PersistentStorage.PersistProp('aProp', 48):在PersistentStorage中查找到“aProp”,找到,值為47。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: