database-storage-guidelines.md 7.3 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
# 轻量级数据存储开发指导

## 场景介绍

轻量级数据存储功能通常用于保存应用的一些常用配置信息,并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中,这些文件可以持久化地存储在设备上。需要注意的是,应用访问的实例包含文件所有数据,这些数据会一直加载在设备的内存中,直到应用主动从内存中将其移除前,应用可以通过Storage的API进行数据操作。

## 接口说明

轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型。

**创建存储实例**

读取指定文件,将数据加载到Storage实例,即可创建一个存储实例,用于数据操作。

**表1** 轻量级数据存储实例创建接口

| 包名              | 接口名                                      | 描述                                        |
| ----------------- | ------------------------------------------- | ------------------------------------------- |
| ohos.data.storage | getStorage(path: string): Promise\<Storage> | 获取文件对应的Storage单实例,用于数据操作。 |

**存入数据**

通过put系列方法,可以增加或修改Storage实例中的数据。

**表2** 轻量级数据存入接口

| 类名    | 接口名                                             | 描述                                            |
| ------- | -------------------------------------------------- | ----------------------------------------------- |
| Storage | put(key: string, value: ValueType): Promise\<void> | 支持值为number、string、boolean类型的数据存入。 |

**读取数据**

通过调用get系列方法,可以读取Storage中的数据。

**表3** 轻量级数据读取接口

| 类名    | 接口名                                                     | 描述                                            |
| ------- | ---------------------------------------------------------- | ----------------------------------------------- |
| Storage | get(key: string, defValue: ValueType): Promise\<ValueType> | 支持获取值为number、string、boolean类型的数据。 |

**数据持久化**

通过执行flush方法,应用可以将缓存的数据再次写回文本文件中进行持久化存储。

**表4** 轻量级数据持久化接口

| 类名    | 接口名                  | 描述                                    |
| ------- | ----------------------- | --------------------------------------- |
| Storage | flush(): Promise\<void> | 将Storage实例通过异步线程回写入文件中。 |

**订阅数据变化**

订阅数据变化需要指定StorageObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,StorageObserver被回调。

**表5** 轻量级数据变化订阅接口

| 类名    | 接口名                                                       | 描述           |
| ------- | ------------------------------------------------------------ | -------------- |
| Storage | on(type: 'change', callback: Callback\<StorageObserver>): void | 订阅数据变化。 |
| Storage | off(type: 'change', callback: Callback\<StorageObserver>): void | 注销订阅。     |

**删除数据文件**

通过调用以下两种接口,可以删除数据实例或对应的文件。

**表6** 轻量级数据存储删除接口

| 包名              | 接口名                                               | 描述                                                         |
| ----------------- | ---------------------------------------------------- | ------------------------------------------------------------ |
| ohos.data.storage | deleteStorage(path: string): Promise\<void>          | 从缓存中移除已加载的Storage对象,同时从设备上删除对应的文件。 |
| ohos.data.storage | removeStorageFromCache(path: string): Promise\<void> | 仅从缓存中移除已加载的Storage对象,主要用于释放内存。        |

## 开发步骤

1. 准备工作,导入@ohos.data.storage以及相关的模块到开发环境。

77
   ```js
Z
zengyawen 已提交
78 79 80 81 82 83 84
   import dataStorage from '@ohos.data.storage'
   import featureAbility from '@ohos.ability.featureAbility'  // 用于获取文件存储路径
   ```

2. 获取Storage实例。

   读取指定文件,将数据加载到Storage实例,用于数据操作。
85
   ```js
Z
zengyawen 已提交
86
   var context = featureAbility.getContext()
W
wuyongning 已提交
87 88 89 90
   context.getFilesDir().then(() => {
    console.info("======================>getFilesDirPromsie====================>");
   });

Z
zengyawen 已提交
91 92 93 94 95 96 97
   let promise = dataStorage.getStorage(path + '/mystore')
   ```

3. 存入数据。

   使用Storage put方法保存数据到缓存的实例中。

98
   ```js
Z
zengyawen 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
   promise.then((storage) => {
       let getPromise = storage.put('startup', 'auto') // 保存数据到缓存的storage示例中。
       getPromise.then(() => {
           console.info("Put the value of startup successfully.")
       }).catch((err) => {
           console.info("Put the value of startup failed with err: " + err)
       })
   }).catch((err) => {
       console.info("Get the storage failed")
   })
   ```

4. 读取数据。

   使用Storage get方法读取数据。

115
   ```js
Z
zengyawen 已提交
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
   promise.then((storage) => {
       let getPromise = storage.get('startup', 'default')
       getPromise.then((value) => {
           console.info("The value of startup is " + value)
       }).catch((err) => {
           console.info("Get the value of startup failed with err: " + err)
       })
   }).catch((err) => {
       console.info("Get the storage failed")})
   ```

5. 数据持久化。

   应用存入数据到Storage实例后,可以通过flush或者flushSync方法将Storage实例回写到文件中。

131
   ```js
Z
zengyawen 已提交
132 133 134 135 136 137 138
   storage.flush();
   ```

6. 订阅数据变化。

   应用订阅数据变化需要指定StorageObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,StorageObserver被触发回调。不再需要StorageObserver时请注销。

139
   ```js
Z
zengyawen 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
   promise.then((storage) => {
       var observer = function (key) {
           console.info("The key of " + key + " changed.")
       }
       storage.on('change', observer)
       storage.putSync('startup', 'auto')  // 修改storage存储数据
       storage.flushSync()  // 触发订阅者回调方法
   
       storage.off('change', observer) // 注销数据变化订阅
   }).catch((err) => {
       console.info("Get the storage failed")
   })
   ```

7. 删除指定文件。

   使用deleteStorage方法从内存中移除指定文件对应的Storage单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。删除后,数据及文件将不可恢复。

158
   ```js
Z
zengyawen 已提交
159 160 161 162 163
   let promise = dataStorage.deleteStorage(path + '/mystore')
   promise.then(() => {
       console.info("Deleted successfully.")
   }).catch((err) => {
       console.info("Deleted failed with err: " + err)})
164 165 166
   ```
## 相关实例
针对轻量级数据存储开发,有以下相关实例可供参考:
167 168
- [轻量级偏好数据库(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/Database)
- [备忘录(eTS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/NotePad_OH_ETS)