1# 轻量级数据存储开发指导 2 3## 场景介绍 4 5轻量级数据存储功能通常用于保存应用的一些常用配置信息,并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中,这些文件可以持久化地存储在设备上。需要注意的是,应用访问的实例包含文件所有数据,这些数据会一直加载在设备的内存中,直到应用主动从内存中将其移除前,应用可以通过Storage的API进行数据操作。 6 7## 接口说明 8 9轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型。 10 11**创建存储实例** 12 13读取指定文件,将数据加载到Storage实例,即可创建一个存储实例,用于数据操作。 14 15**表1** 轻量级数据存储实例创建接口 16 17| 包名 | 接口名 | 描述 | 18| ----------------- | ------------------------------------------- | ------------------------------------------- | 19| ohos.data.storage | getStorage(path: string): Promise\<Storage> | 获取文件对应的Storage单实例,用于数据操作。 | 20 21**存入数据** 22 23通过put系列方法,可以增加或修改Storage实例中的数据。 24 25**表2** 轻量级数据存入接口 26 27| 类名 | 接口名 | 描述 | 28| ------- | -------------------------------------------------- | ----------------------------------------------- | 29| Storage | put(key: string, value: ValueType): Promise\<void> | 支持值为number、string、boolean类型的数据存入。 | 30 31**读取数据** 32 33通过调用get系列方法,可以读取Storage中的数据。 34 35**表3** 轻量级数据读取接口 36 37| 类名 | 接口名 | 描述 | 38| ------- | ---------------------------------------------------------- | ----------------------------------------------- | 39| Storage | get(key: string, defValue: ValueType): Promise\<ValueType> | 支持获取值为number、string、boolean类型的数据。 | 40 41**数据持久化** 42 43通过执行flush方法,应用可以将缓存的数据再次写回文本文件中进行持久化存储。 44 45**表4** 轻量级数据持久化接口 46 47| 类名 | 接口名 | 描述 | 48| ------- | ----------------------- | --------------------------------------- | 49| Storage | flush(): Promise\<void> | 将Storage实例通过异步线程回写入文件中。 | 50 51**订阅数据变化** 52 53订阅数据变化需要指定StorageObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,StorageObserver被回调。 54 55**表5** 轻量级数据变化订阅接口 56 57| 类名 | 接口名 | 描述 | 58| ------- | ------------------------------------------------------------ | -------------- | 59| Storage | on(type: 'change', callback: Callback\<StorageObserver>): void | 订阅数据变化。 | 60| Storage | off(type: 'change', callback: Callback\<StorageObserver>): void | 注销订阅。 | 61 62**删除数据文件** 63 64通过调用以下两种接口,可以删除数据实例或对应的文件。 65 66**表6** 轻量级数据存储删除接口 67 68| 包名 | 接口名 | 描述 | 69| ----------------- | ---------------------------------------------------- | ------------------------------------------------------------ | 70| ohos.data.storage | deleteStorage(path: string): Promise\<void> | 从缓存中移除已加载的Storage对象,同时从设备上删除对应的文件。 | 71| ohos.data.storage | removeStorageFromCache(path: string): Promise\<void> | 仅从缓存中移除已加载的Storage对象,主要用于释放内存。 | 72 73## 开发步骤 74 751. 准备工作,导入@ohos.data.storage以及相关的模块到开发环境。 76 77 ```js 78 import dataStorage from '@ohos.data.storage'; 79 import featureAbility from '@ohos.ability.featureAbility'; // 用于获取文件存储路径 80 ``` 81 822. 获取Storage实例。 83 84 读取指定文件,将数据加载到Storage实例,用于数据操作。 85 ```js 86 var path; 87 var context = featureAbility.getContext(); 88 context.getFilesDir().then((filePath) => { 89 path = filePath; 90 console.info("======================>getFilesDirPromsie====================>"); 91 92 let promise = dataStorage.getStorage(path + '/mystore'); 93 }); 94 ``` 95 963. 存入数据。 97 98 使用Storage put方法保存数据到缓存的实例中。 99 100 ```js 101 promise.then((storage) => { 102 let getPromise = storage.put('startup', 'auto'); // 保存数据到缓存的storage实例中 103 getPromise.then(() => { 104 console.info("Succeeded in putting the value of startup."); 105 }).catch((err) => { 106 console.info("Failed to put the value of startup failed with err: " + err); 107 }) 108 }).catch((err) => { 109 console.info("Failed to get the storage."); 110 }) 111 ``` 112 1134. 读取数据。 114 115 使用Storage get方法读取数据。 116 117 ```js 118 promise.then((storage) => { 119 let getPromise = storage.get('startup', 'default') 120 getPromise.then((value) => { 121 console.info("The value of startup is " + value); 122 }).catch((err) => { 123 console.info("Failed to get the value of startup with err: " + err); 124 }) 125 }).catch((err) => { 126 console.info("Failed to get the storage.") 127 128 }) 129 ``` 130 1315. 数据持久化。 132 133 应用存入数据到Storage实例后,可以通过flush或者flushSync方法将Storage实例回写到文件中。 134 135 ```js 136 storage.flush(); 137 ``` 138 1396. 订阅数据变化。 140 141 应用订阅数据变化需要指定StorageObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,StorageObserver被触发回调。不再需要StorageObserver时请注销。 142 143 ```js 144 promise.then((storage) => { 145 var observer = function (key) { 146 console.info("The key of " + key + " changed."); 147 } 148 storage.on('change', observer) 149 storage.putSync('startup', 'auto'); // 修改storage存储数据 150 storage.flushSync(); // 触发订阅者回调方法 151 152 storage.off('change', observer); // 注销数据变化订阅 153 }).catch((err) => { 154 console.info("Failed to get the storage."); 155 }) 156 ``` 157 1587. 删除指定文件。 159 160 使用deleteStorage方法从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。删除后,数据及文件将不可恢复。 161 162 ```js 163 let promise = dataStorage.deleteStorage(path + '/mystore'); 164 promise.then(() => { 165 console.info("Succeeded in deleting the storage."); 166 }).catch((err) => { 167 console.info("Failed to delete the storage with err: " + err); 168 169 }) 170 ``` 171## 相关实例 172针对轻量级数据存储开发,有以下相关实例可供参考: 173- [轻量级偏好数据库(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/Database) 174- [备忘录(eTS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/NotePad_OH_ETS)