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