database-relational-guidelines.md 22.2 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9
# 关系型数据库开发指导

## 场景介绍

关系型数据库是在SQLite基础上实现的本地数据操作机制,提供给用户无需编写原生SQL语句就能进行数据增删改查的方法,同时也支持原生SQL语句操作。


## 接口说明

10
以下是关系型数据库的常用接口说明,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以Promise形式为例,更多接口及使用方式请见[关系型数据库](../reference/apis/js-apis-data-relationalStore.md)
11

Z
zengyawen 已提交
12
### 数据库的创建和删除
Z
zengyawen 已提交
13 14 15 16 17

关系型数据库提供了数据库创建方式,以及对应的删除接口,涉及的API如下所示。

**表1** 数据库创建和删除API

18 19
| 接口名                                                       | 描述                                                         |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
20 21
| getRdbStore(context: Context, config: StoreConfig): Promise&lt;RdbStore&gt; | 获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作,使用Promise异步回调。<br/>-context:应用程序或功能的上下文。<br/>-config:与此RDB存储相关的数据库配置。 |
| deleteRdbStore(context: Context, name: string): Promise&lt;void&gt; | 使用指定的数据库文件配置删除数据库,使用Promise异步回调。<br/>-context:应用程序或功能的上下文。<br/>-name:数据库名称。 |
Z
zengyawen 已提交
22

Z
zengyawen 已提交
23
### 数据库的增删改查
Z
zengyawen 已提交
24 25 26 27

关系型数据库提供对本地数据增删改查操作的能力,相关API如下所示。

- **新增**
Z
zengyawen 已提交
28 29 30
  
  关系型数据库提供了插入数据的接口,通过ValuesBucket输入要存储的数据,通过返回值判断是否插入成功,插入成功时返回最新插入数据所在的行号,失败时则返回-1。
  
Z
zengyawen 已提交
31 32
  **表2** 数据库插入API
  
33

L
lihuihui 已提交
34 35
  | 类名       | 接口名                                                       | 描述                                                         |
  | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
36
  | RdbStore | insert(table: string, values: ValuesBucket): Promise&lt;number&gt; | 向目标表中插入一行数据,使用Promise异步回调。<br>如果操作成功,返回行ID;否则返回-1。<br/>-table:指定的目标表名。<br/>-values:表示要插入到表中的数据行。 |
Z
zengyawen 已提交
37
  
Z
zengyawen 已提交
38
- **更新**
Z
zengyawen 已提交
39
  
40
  调用更新接口,传入要更新的数据,并通过RdbPredicates指定更新条件。该接口的返回值表示更新操作影响的行数。如果更新失败,则返回0。
Z
zengyawen 已提交
41
  
Z
zengyawen 已提交
42 43
  **表3** 数据库更新API
  
44

L
lihuihui 已提交
45 46
  | 类名       | 接口名                                                       | 描述                                                         |
  | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
47
  | RdbStore | update(values: ValuesBucket, predicates: RdbPredicates): Promise&lt;number&gt; | 根据RdbPredicates的指定实例对象更新数据库中的数据,使用Promise异步回调。<br>返回受影响的行数。<br/>-values:以ValuesBucket存储的要更新的数据。<br/>-predicates:表示RdbPredicates的实例对象指定的更新条件。 |
Z
zengyawen 已提交
48
  
Z
zengyawen 已提交
49 50
- **删除** 
  
51
  调用删除接口,通过RdbPredicates指定删除条件。该接口的返回值表示删除的数据行数,可根据此值判断是否删除成功。如果删除失败,则返回0。
Z
zengyawen 已提交
52
  
Z
zengyawen 已提交
53 54
  **表4** 数据库删除API
  
55

L
lihuihui 已提交
56 57
  | 类名       | 接口名                                                     | 描述                                                         |
  | ---------- | ---------------------------------------------------------- | ------------------------------------------------------------ |
58
  | RdbStore | delete(predicates: RdbPredicates): Promise&lt;number&gt; | 根据RdbPredicates的指定实例对象从数据库中删除数据,使用Promise异步回调。<br>返回受影响的行数。 <br/>-predicates:RdbPredicates的实例对象指定的删除条件。 |
Z
zengyawen 已提交
59
  
Z
zengyawen 已提交
60 61
- **查询** 

Z
zengyawen 已提交
62 63 64 65
  关系型数据库提供了两种查询数据的方式:

  - 直接调用查询接口。使用该接口,会将包含查询条件的谓词自动拼接成完整的SQL语句进行查询操作,无需用户传入原生的SQL语句。
  - 执行原生的SQL语句进行查询操作。
Z
zengyawen 已提交
66

P
PaDaBoo 已提交
67
**表5** 数据库查询API
Z
zengyawen 已提交
68

69

L
lihuihui 已提交
70 71
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
72 73 74
| RdbStore | query(predicates: RdbPredicates, columns?: Array&lt;string&gt;): Promise&lt;ResultSet&gt; | 根据指定条件查询数据库中的数据,使用Promise异步回调。<br/>-predicates:表示RdbPredicates的实例对象指定的查询条件。<br/>-columns:表示要查询的列。如果值为空,则查询应用于所有列。 |
| RdbStore | querySql(sql: string, bindArgs?: Array&lt;ValueType&gt;): Promise&lt;ResultSet&gt; | 根据指定SQL语句查询数据库中的数据,使用Promise异步回调。<br/>-sql:指定要查询的SQL语句。<br/>-bindArgs:SQL语句中参数的值。 |
| RdbStore | remoteQuery(device: string, table: string, predicates: RdbPredicates, columns: Array&lt;string&gt;): Promise&lt;ResultSet&gt; | 根据指定条件查询指定远程设备数据库中的数据。使用Promise异步回调。<br/>-device:指定远程查询的设备networkId。<br/>-table:指定远程查询的表名。<br/>-predicates:表示RdbPredicates的实例对象,指定查询的条件。<br/>-columns:表示要查询的列。如果值为空,则查询应用于所有列。 |
Z
zengyawen 已提交
75

Z
zengyawen 已提交
76
### 数据库谓词的使用
Z
zengyawen 已提交
77

78
关系型数据库提供了用于设置数据库操作条件的谓词RdbPredicates,该类确定RDB中条件表达式的值是true还是false。
Z
zengyawen 已提交
79

80
以下列举几个常用谓词,更多谓词的使用请见[关系型数据库谓词](../reference/apis/js-apis-data-relationalStore.md#rdbpredicates)
81

Z
zengyawen 已提交
82 83
**表6** 数据库谓词API

L
lihuihui 已提交
84 85
| 类名            | 接口名                                                       | 描述                                                         |
| --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
86 87 88 89 90
| RdbPredicates | equalTo(field: string, value: ValueType): RdbPredicates    | 配置谓词以匹配数据字段为ValueType且值等于指定值的字段。<br/>-field:数据库表中的列名。<br/>-value:指示要与谓词匹配的值。<br/>-RdbPredicates:返回与指定字段匹配的谓词。 |
| RdbPredicates | notEqualTo(field: string, value: ValueType): RdbPredicates | 配置谓词以匹配数据字段为ValueType且值不等于指定值的字段。<br/>-field:数据库表中的列名。<br/>-value:指示要与谓词匹配的值。<br/>-RdbPredicates:返回与指定字段匹配的谓词。 |
| RdbPredicates | or(): RdbPredicates                                        | 将或条件添加到谓词中。<br/>-RdbPredicates:返回带有或条件的谓词。 |
| RdbPredicates | and(): RdbPredicates                                       | 向谓词添加和条件。<br/>-RdbPredicates:返回带有和条件的谓词。 |
| RdbPredicates | contains(field: string, value: string): RdbPredicates      | 配置谓词以匹配数据字段为String且value包含指定值的字段。<br/>-field:数据库表中的列名。<br/>-value:指示要与谓词匹配的值。<br/>-RdbPredicates:返回带有包含条件的谓词。 |
91

Z
zengyawen 已提交
92

Z
zengyawen 已提交
93
### 查询结果集的使用
Z
zengyawen 已提交
94

95
关系型数据库提供了查询返回的结果集ResultSet,其指向查询结果中的一行数据,供用户对查询结果进行遍历和访问。
96

97
更多结果集的接口使用,请见[结果集](../reference/apis/js-apis-data-relationalStore.md#resultset)
Z
zengyawen 已提交
98

99
> **须知:**
Z
zengyawen 已提交
100
> **结果集使用完后,请一定要调用close方法显式关闭。**
Z
zengyawen 已提交
101 102 103

**表7** 结果集API

L
lihuihui 已提交
104 105
| 类名        | 接口名                                   | 描述                                       |
| ----------- | ---------------------------------------- | ------------------------------------------ |
106 107 108 109 110 111
| ResultSet | goToFirstRow(): boolean                  | 将结果集移动到第一行。                     |
| ResultSet | getString(columnIndex: number): string   | 获取当前行指定列的值,以String类型返回。   |
| ResultSet | getBlob(columnIndex: number): Uint8Array | 获取当前行指定列的值,以字节数组形式返回。 |
| ResultSet | getDouble(columnIndex: number): number   | 获取当前行指定列的值,以double型返回。     |
| ResultSet | getLong(columnIndex: number): number     | 获取当前行指定列的值,以Long形式返回。     |
| ResultSet | close(): void                            | 关闭结果集。                               |
Z
zengyawen 已提交
112 113 114



Z
zengyawen 已提交
115
### 设置分布式列表
S
sun-dou 已提交
116

117 118
> **说明:**  
>
119
> - 在使用RdbStore的setDistributedTables、obtainDistributedTableName、sync、on、off接口时,需要请求相应的权限:ohos.permission.DISTRIBUTED_DATASYNC。
120
> - 使用分布式列表前,需要先建立设备间组网,具体接口及使用可见[设备管理](../reference/apis/js-apis-device-manager.md)。
W
wuyongning 已提交
121

Z
zengyawen 已提交
122
**设置分布式列表**
S
sun-dou 已提交
123

Z
zengyawen 已提交
124
**表8** 设置分布式列表
S
sun-dou 已提交
125

L
lihuihui 已提交
126 127
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
128
| RdbStore | setDistributedTables(tables: Array\<string>): Promise\<void> | 设置分布式列表,使用Promise异步回调。<br/>-tables:要设置的分布式列表表名。 |
S
sun-dou 已提交
129

Z
zengyawen 已提交
130
**根据本地表名获取指定远程设备的分布式表名**
S
sun-dou 已提交
131 132 133

用户根据本地表名获取指定远程设备的分布式表名。在查询远程设备数据库时,需要使用分布式表名。

Z
zengyawen 已提交
134
**表9** 根据本地表名获取指定远程设备的分布式表名
S
sun-dou 已提交
135

L
lihuihui 已提交
136 137
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
138
| RdbStore | obtainDistributedTableName(device: string, table: string): Promise\<string> | 根据本地表名获取指定远程设备的分布式表名。在查询远程设备数据库时,需要使用分布式表名,使用Promise异步回调。<br/>-device:远程设备。<br/>-table:本地表名。 |
S
sun-dou 已提交
139

Z
zengyawen 已提交
140
**在设备之间同步数据**
S
sun-dou 已提交
141

Z
zengyawen 已提交
142
**表10** 在设备之间同步数据
S
sun-dou 已提交
143

L
lihuihui 已提交
144 145
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
146
| RdbStore | sync(mode: SyncMode, predicates: RdbPredicates): Promise\<Array\<[string, number]>> | 在设备之间同步数据,使用Promise异步回调。<br/>-mode:指同步模式。SYNC_MODE_PUSH 表示数据从本地设备推送到远程设备;SYNC_MODE_PULL 表示数据从远程设备拉至本地设备。<br/>-predicates:约束同步数据和设备。<br>-string:设备ID;number:每个设备同步状态,0表示成功,其他值表示失败。 |
S
sun-dou 已提交
147

Z
zengyawen 已提交
148
**注册数据库的观察者**
S
sun-dou 已提交
149

Z
zengyawen 已提交
150
**表11** 注册数据库的观察者
S
sun-dou 已提交
151

L
lihuihui 已提交
152 153
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
154
| RdbStore | on(event: 'dataChange', type: SubscribeType, observer: Callback\<Array\<string>>): void | 注册数据库的观察者。当分布式数据库中的数据发生更改时,将调用回调。<br/>-type:订阅类型;SUBSCRIBE_TYPE_REMOTE 订阅远程数据更改。<br/>-observer:指分布式数据库中数据更改事件的观察者。 |
S
sun-dou 已提交
155

Z
zengyawen 已提交
156
**从数据库中删除指定类型的指定观察者**
S
sun-dou 已提交
157

Z
zengyawen 已提交
158
**表12** 从数据库中删除指定类型的指定观察者
S
sun-dou 已提交
159

L
lihuihui 已提交
160 161
| 类名       | 接口名                                                       | 描述                                                         |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
162
| RdbStore | off(event:'dataChange', type: SubscribeType, observer: Callback\<Array\<string>>): void; | 从数据库中删除指定类型的指定观察者,使用callback异步回调。<br/>-type:订阅类型;SUBSCRIBE_TYPE_REMOTE 订阅远程数据更改。<br/>-observer:指已注册的数据更改观察者。 |
S
sun-dou 已提交
163

W
wuyongning 已提交
164 165 166 167 168 169
### 数据库的备份和恢复

**备份**

**表13** 备份数据库

L
lihuihui 已提交
170 171
| 类名       | 接口名                                        | 描述                                                         |
| ---------- | --------------------------------------------- | ------------------------------------------------------------ |
172
| RdbStore | backup(destName: string): Promise&lt;void&gt; | 以指定名称备份数据库,使用Promise异步回调。<br/>-destName:指定数据库的备份文件名。 |
W
wuyongning 已提交
173 174 175

**恢复**

176
**表14** 恢复数据库
W
wuyongning 已提交
177

L
lihuihui 已提交
178 179
| 类名       | 接口名                                        | 描述                                                         |
| ---------- | --------------------------------------------- | ------------------------------------------------------------ |
180
| RdbStore | restore(srcName: string): Promise&lt;void&gt; | 从指定的数据库备份文件恢复数据库,使用Promise异步回调。<br/>-srcName:指定数据库的备份文件名。 |
Z
zengyawen 已提交
181

182
### 事务
183 184 185

**表15** 事务

186 187
| 类名     | 接口名                  | 描述                              |
| -------- | ----------------------- | --------------------------------- |
188 189 190
| RdbStore | beginTransaction(): void | 在开始执行SQL语句之前,开始事务。 |
| RdbStore | commit(): void           | 提交已执行的SQL语句。             |
| RdbStore | rollBack(): void         | 回滚已经执行的SQL语句。           |
191

Z
zengyawen 已提交
192 193 194
## 开发步骤

1. 创建数据库。
W
wuyongning 已提交
195 196 197 198 199 200

   (1) 配置数据库相关信息,包括数据库的名称、存储模式、是否为只读模式等。

   (2) 初始化数据库表结构和相关数据。

   (3) 创建数据库。
Z
zengyawen 已提交
201

202
   FA模型示例:
Z
zengyawen 已提交
203

W
wuyongning 已提交
204
    ```js
205
   import data_rdb from '@ohos.data.relationalStore'
206 207
    // 获取context
   import featureAbility from '@ohos.ability.featureAbility'
L
ltdong 已提交
208
   let context = featureAbility.getContext()
L
lihuihui 已提交
209
   
210
   const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT NOT NULL, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)";
L
lihuihui 已提交
211
   
212
   const STORE_CONFIG = { name: "RdbTest.db",
L
lihuihui 已提交
213
                         securityLevel: data_rdb.SecurityLevel.S1}
214 215
   data_rdb.getRdbStore(context, STORE_CONFIG, function (err, rdbStore) {
      rdbStore.executeSql(CREATE_TABLE_TEST)
216
      console.info('create table done.')
217 218 219
   })
    ```
    Stage模型示例:
L
ltdong 已提交
220
     ```ts
221
   import data_rdb from '@ohos.data.relationalStore'
222 223
    // 获取context
   import Ability from '@ohos.application.Ability'
L
ltdong 已提交
224 225 226 227
   let context = null
   class MainAbility extends Ability {
       onWindowStageCreate(windowStage) {
         context = this.context
228 229
       }
   }
L
lihuihui 已提交
230
   
231
   const CREATE_TABLE_TEST = "CREATE TABLE IF NOT EXISTS test (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT NOT NULL, " + "age INTEGER, " + "salary REAL, " + "blobType BLOB)";
L
lihuihui 已提交
232
   
233
   const STORE_CONFIG = { name: "rdbstore.db",
L
lihuihui 已提交
234
                          securityLevel: data_rdb.SecurityLevel.S1}
235 236
   data_rdb.getRdbStore(context, STORE_CONFIG, function (err, rdbStore) {
       rdbStore.executeSql(CREATE_TABLE_TEST)
237 238
       console.info('create table done.')
   })
L
lihuihui 已提交
239
     ```
Z
zengyawen 已提交
240 241

2. 插入数据。
W
wuyongning 已提交
242 243 244 245

   (1) 构造要插入的数据,以ValuesBucket形式存储。

   (2) 调用关系型数据库提供的插入接口。
Z
zengyawen 已提交
246 247 248

   示例代码如下:

W
wuyongning 已提交
249
    ```js
P
PaDaBoo 已提交
250
    let u8 = new Uint8Array([1, 2, 3])
251
    const valueBucket = { "name": "Tom", "age": 18, "salary": 100.5, "blobType": u8 }
252 253 254 255
    let insertPromise = rdbStore.insert("test", valueBucket)
    ```
    
    ```js
P
PaDaBoo 已提交
256
    //使用事务插入数据
257 258
    beginTransaction()
    try {
P
PaDaBoo 已提交
259
        let u8 = new Uint8Array([1, 2, 3])
260 261
        const valueBucket1 = { "name": "Tom", "age": 18, "salary": 100.5, "blobType": u8 }
        const valueBucket2 = { "name": "Jam", "age": 19, "salary": 200.5, "blobType": u8 }
P
PaDaBoo 已提交
262 263
        let insertPromise1 = rdbStore.insert("test", valueBucket1)
        let insertPromise2 = rdbStore.insert("test", valueBucket2)
264 265 266 267
        commit()
    } catch (e) {
        rollBack()
    }
W
wuyongning 已提交
268
    ```
Z
zengyawen 已提交
269 270

3. 查询数据。
W
wuyongning 已提交
271 272 273 274 275 276

   (1) 构造用于查询的谓词对象,设置查询条件。

   (2) 调用查询接口查询数据。

   (3) 调用结果集接口,返回查询结果。
Z
zengyawen 已提交
277 278 279

   示例代码如下:

W
wuyongning 已提交
280
    ```js
281 282 283 284 285 286 287 288 289 290 291
    let predicates = new data_rdb.RdbPredicates("test");
    predicates.equalTo("name", "Tom")
    let promisequery = rdbStore.query(predicates)
    promisequery.then((resultSet) => {
        resultSet.goToFirstRow()
        const id = resultSet.getLong(resultSet.getColumnIndex("id"))
        const name = resultSet.getString(resultSet.getColumnIndex("name"))
        const age = resultSet.getLong(resultSet.getColumnIndex("age"))
        const salary = resultSet.getDouble(resultSet.getColumnIndex("salary"))
        const blobType = resultSet.getBlob(resultSet.getColumnIndex("blobType"))
        resultSet.close()
W
wuyongning 已提交
292
    })
293
    ```
S
sun-dou 已提交
294 295

4. 设置分布式同步表。
W
wuyongning 已提交
296 297 298

    (1) 权限配置文件中增加以下配置。    

299
    ```json
W
wuyongning 已提交
300
    "requestPermissions": 
301
      {
302
        "name": "ohos.permission.DISTRIBUTED_DATASYNC"
303
      }
W
wuyongning 已提交
304
    ```
W
wuyongning 已提交
305 306 307 308 309 310

    (2) 获取应用权限。

    (3) 数据库调用接口设置分布式同步列表。

    (4) 判断是否设置成功。
S
sun-dou 已提交
311 312 313

   示例代码如下:

W
wuyongning 已提交
314 315 316 317 318
    ```js
    let context = featureAbility.getContext();
    context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'], 666, function (result) {
        console.info(`result.requestCode=${result.requestCode}`)
    })
319
    let promise = rdbStore.setDistributedTables(["test"])
W
wuyongning 已提交
320 321 322 323 324 325
    promise.then(() => {
        console.info("setDistributedTables success.")
    }).catch((err) => {
        console.info("setDistributedTables failed.")
    })
    ```
S
sun-dou 已提交
326

W
wuyongning 已提交
327
5. 分布式数据同步。
W
wuyongning 已提交
328 329 330 331 332 333

    (1) 构造用于同步分布式表的谓词对象,指定组网内的远程设备。

    (2) 调用同步数据的接口。

    (3) 判断数据同步是否成功。
S
sun-dou 已提交
334 335 336

    示例代码如下:

337
    ```js
338 339 340
    let predicate = new data_rdb.RdbPredicates('test')
    predicate.inDevices(['12345678abcde'])
    let promise = rdbStore.sync(data_rdb.SyncMode.SYNC_MODE_PUSH, predicate)
341
    promise.then((result) => {
S
sun-dou 已提交
342 343
        console.log('sync done.')
        for (let i = 0; i < result.length; i++) {
344
            console.log('device=' + result[i][0] + 'status=' + result[i][1])
S
sun-dou 已提交
345 346 347 348 349 350
        }
    }).catch((err) => {
        console.log('sync failed')
    })
    ```

W
wuyongning 已提交
351
6. 分布式数据订阅。
W
wuyongning 已提交
352 353 354 355
  
    (1) 调用分布式数据订阅接口,注册数据库的观察者。

    (2) 当分布式数据库中的数据发生更改时,将调用回调。
S
sun-dou 已提交
356 357 358

    示例代码如下:

359
    ```js
S
sun-dou 已提交
360 361
    function storeObserver(devices) {
        for (let i = 0; i < devices.length; i++) {
362
            console.log('device=' + device[i] + 'data changed')
S
sun-dou 已提交
363 364
        }
    }
L
lihuihui 已提交
365
  
S
sun-dou 已提交
366
    try {
367
        rdbStore.on('dataChange', data_rdb.SubscribeType.SUBSCRIBE_TYPE_REMOTE, storeObserver)
S
sun-dou 已提交
368 369 370 371 372
    } catch (err) {
        console.log('register observer failed')
    }
    ```

W
wuyongning 已提交
373
7. 跨设备查询。
W
wuyongning 已提交
374 375 376 377
   
    (1) 根据本地表名获取指定远程设备的分布式表名。

    (2) 调用结果集接口,返回查询结果。
S
sun-dou 已提交
378 379 380

    示例代码如下:

381
    ```js
382 383
    let tableName = rdbStore.obtainDistributedTableName(deviceId, "test");
    let resultSet = rdbStore.querySql("SELECT * FROM " + tableName)
S
sun-dou 已提交
384
    ```
385 386 387 388 389 390 391 392 393 394 395
    
8. 远程查询。
   
   
   (1) 构造用于查询分布式表的谓词对象,指定组网内的远程分布式表名和设备。
   
   (2) 调用结果集接口,返回查询结果。
   
   示例代码如下:
   
    ```js
396 397 398 399 400 401 402 403
    let rdbPredicate = new data_rdb.RdbPredicates('employee')
    predicates.greaterThan("id", 0) 
    let promiseQuery = rdbStore.remoteQuery('12345678abcde', 'employee', rdbPredicate)
    promiseQuery.then((resultSet) => {
        while (resultSet.goToNextRow()) {
            let idx = resultSet.getLong(0);
            let name = resultSet.getString(1);
            let age = resultSet.getLong(2);
L
li_juntao 已提交
404
            console.info(idx + " " + name + " " + age);
405
        }
406
        resultSet.close();
407
    }).catch((err) => {
L
li_juntao 已提交
408
        console.info("failed to remoteQuery, err: " + err)
409 410 411 412
    })
    ```
   
9. 数据库的备份和恢复。
W
wuyongning 已提交
413 414 415

   (1) 调用数据库的备份接口,备份当前数据库文件。

416
    示例代码如下:
417 418

    ```js
419
    let promiseBackup = rdbStore.backup("dbBackup.db")
420
    promiseBackup.then(() => {
421
        console.info('Backup success.')
422
    }).catch((err) => {
423 424 425
        console.info('Backup failed, err: ' + err)
    })
    ```
426 427 428 429
   (2) 调用数据库的恢复接口,从数据库的备份文件恢复数据库文件。
   
    示例代码如下:

430
    ```js
431
    let promiseRestore = rdbStore.restore("dbBackup.db")
432
    promiseRestore.then(() => {
433
        console.info('Restore success.')
434
    }).catch((err) => {
435 436 437 438
        console.info('Restore failed, err: ' + err)
    })
    ```

439 440
## 相关实例
针对关系型数据库开发,有以下相关实例可供参考:
441
- [`DistributedRdb`:分布式关系型数据库(ArkTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/data/DistributedRdb)
L
ltdong 已提交
442
- [关系型数据库(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/JSRelationshipData)