• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)