Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
b69407aa
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b69407aa
编写于
7月 29, 2023
作者:
L
lihuihui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rdb
Signed-off-by:
N
lihuihui
<
lihuihui29@huawei.com
>
上级
ee96226f
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
172 addition
and
0 deletion
+172
-0
zh-cn/application-dev/napi/Readme-CN.md
zh-cn/application-dev/napi/Readme-CN.md
+3
-0
zh-cn/application-dev/napi/native-rdb-store-guidelines.md
zh-cn/application-dev/napi/native-rdb-store-guidelines.md
+169
-0
未找到文件。
zh-cn/application-dev/napi/Readme-CN.md
浏览文件 @
b69407aa
...
...
@@ -19,3 +19,6 @@
-
[
Purgeable memory开发指导
](
purgeable-memory-guidelines.md
)
-
设备管理
-
[
USB DDK开发指导
](
usb-ddk-guidelines.md
)
-
数据管理
-
[
NativeRdbStore开发指导
](
native-rdb-store-guidelines.md
)
zh-cn/application-dev/napi/native-rdb-store-guidelines.md
0 → 100644
浏览文件 @
b69407aa
# NativeRdbStore开发指导
## 场景介
NativeRdbStore是RDB组件在Native层的实现,提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。
## 基本概念
-
**谓词**
:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
-
**结果集**
:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。
## 约束限制
-
系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。
-
数据库中连接池的最大数量是4个,用以管理用户的读操作。
-
为保证数据的准确性,数据库同一时间只能支持一个写操作。
-
当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。
## 接口说明
详细的接口说明请参考
[
关系型数据库
](
../reference/native-apis/_r_d_b.md
)
。
| 接口名称 | 描述 |
| -------- | -------- |
| OH_Rdb_GetOrOpen(const OH_Rdb_Config
*config, int *
errCode) | 获得一个相关的OH_Rdb_Store实例,操作关系型数据库。 |
| OH_Rdb_Execute(OH_Rdb_Store
*store, const char *
sql) | 执行包含指定参数但不返回值的SQL语句。 |
| OH_Rdb_Insert(OH_Rdb_Store
*store, const char *
table, OH_VBucket
*
valuesBucket) | 向目标表中插入一行数据。 |
| OH_Rdb_Update(OH_Rdb_Store
*store, OH_VBucket *
valuesBucket, OH_Predicates
*
predicates); | 根据OH_Predicates的指定实例对象更新数据库中的数据。 |
| OH_Rdb_Delete(OH_Rdb_Store
*store, OH_Predicates *
predicates) | 根据OH_Predicates的指定实例对象从数据库中删除数据。 |
| OH_Rdb_Query(OH_Rdb_Store
*store, OH_Predicates *
predicates, const char
*const *
columnNames, int length) | 根据指定条件查询数据库中的数据。 |
| OH_Rdb_DeleteStore(const OH_Rdb_Config
*
config) | 删除数据库。 |
## 开发步骤
1.
获取OH_Rdb_Store实例,创建数据库文件。示例代码如下所示:
```
js
// 创建OH_Rdb_Config对象
OH_Rdb_Config
config
;
// 该路径为应用沙箱路径
config
.
dataBaseDir
=
"
xxx
"
;
// 数据库文件名
config
.
storeName
=
"
RdbTest.db
"
;
// 应用包名
config
.
bundleName
=
"
xxx
"
// 应用模块名
config
.
moduleName
=
""
;
// 数据库安全等级测试
config
.
securityLevel
=
OH_Rdb_SecurityLevel
::
S1
;
// 数据库是否加密
config
.
isEncrypt
=
false
;
// config所占内存大小
config
.
selfSize
=
sizeof
(
OH_Rdb_Config
);
int
errCode
=
0
;
// 获取获取OH_Rdb_Store实例
OH_Rdb_Store
*
store_
=
OH_Rdb_GetOrOpen
(
&
config
,
&
errCode
);
```
2.
获取到OH_Rdb_Store后,调用OH_Rdb_Execute接口创建表,并调用OH_Rdb_Insert接口插入数据。示例代码如下所示:
```
js
char
createTableSql
[]
=
"
CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)
"
;
// 执行建表语句
OH_Rdb_Execute
(
store_
,
createTableSql
);
// 创建键值对实例
OH_VBucket
*
valueBucket
=
OH_Rdb_CreateValuesBucket
();
valueBucket
->
putText
(
valueBucket
,
"
NAME
"
,
"
Lisa
"
);
valueBucket
->
putInt64
(
valueBucket
,
"
AGE
"
,
18
);
valueBucket
->
putReal
(
valueBucket
,
"
SALARY
"
,
100.5
);
uint8_t
arr
[]
=
{
1
,
2
,
3
,
4
,
5
};
int
len
=
sizeof
(
arr
)
/
sizeof
(
arr
[
0
]);
valueBucket
->
putBlob
(
valueBucket
,
"
CODES
"
,
arr
,
len
);
// 插入数据
int
rowId
=
OH_Rdb_Insert
(
store_
,
"
EMPLOYEE
"
,
valueBucket
);
// 销毁键值对实例
valueBucket
->
destroy
(
valueBucket
);
```
> **说明:**
>
> 关系型数据库没有显式的flush操作实现持久化,数据插入即保存在持久化文件。
3.
根据谓词指定的实例对象,对数据进行修改或删除。
调用OH_Rdb_Update方法修改数据,调用OH_Rdb_Delete方法删除数据。示例代码如下所示:
```
js
// 修改数据
OH_VBucket
*
valueBucket
=
OH_Rdb_CreateValuesBucket
();
valueBucket
->
putText
(
valueBucket
,
"
NAME
"
,
"
Rose
"
);
valueBucket
->
putInt64
(
valueBucket
,
"
AGE
"
,
22
);
valueBucket
->
putReal
(
valueBucket
,
"
SALARY
"
,
200.5
);
uint8_t
arr
[]
=
{
1
,
2
,
3
,
4
,
5
};
int
len
=
sizeof
(
arr
)
/
sizeof
(
arr
[
0
]);
valueBucket
->
putBlob
(
valueBucket
,
"
CODES
"
,
arr
,
len
);
OH_Predicates
*
predicates
=
OH_Rdb_CreatePredicates
(
"
EMPLOYEE
"
);
OH_VObject
*
valueObject
=
OH_Rdb_CreateValueObject
();
const
char
*
name
=
"
Lisa
"
;
valueObject
->
putText
(
valueObject
,
name
);
predicates
->
equalTo
(
predicates
,
"
NAME
"
,
valueObject
);
int
changeRows
=
OH_Rdb_Update
(
store_
,
valueBucket
,
predicates
);
predicates
->
destroyPredicates
(
predicates
);
valueBucket
->
destroy
(
valueBucket
);
// 删除数据
OH_Predicates
*
predicates
=
OH_Rdb_CreatePredicates
(
"
EMPLOYEE
"
);
OH_VObject
*
valueObject
=
OH_Rdb_CreateValueObject
();
const
char
*
name
=
"
Lisa
"
;
valueObject
->
putText
(
valueObject
,
name
);
predicates
->
equalTo
(
predicates
,
"
NAME
"
,
valueObject
);
int
deleteRows
=
OH_Rdb_Delete
(
store_
,
predicates
);
predicates
->
destroyPredicates
(
predicates
);
```
4.
根据谓词指定的查询条件查找数据。
调用OH_Rdb_Query方法查找数据,返回一个OH_Cursor结果集。示例代码如下所示:
```
js
OH_Predicates
*
predicates
=
OH_Rdb_CreatePredicates
(
"
EMPLOYEE
"
);
const
char
*
columnNames
[]
=
{
"
NAME
"
,
"
AGE
"
};
int
len
=
sizeof
(
columnNames
)
/
sizeof
(
columnNames
[
0
]);
OH_Cursor
*
cursor
=
OH_Rdb_Query
(
store_
,
predicates
,
columnNames
,
len
);
int
columnCount
=
0
;
cursor
->
getColumnCount
(
cursor
,
&
columnCount
);
// OH_Cursor是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始
cursor
->
goToNextRow
(
cursor
);
size_t
size
=
0
;
cursor
->
getSize
(
cursor
,
0
,
&
size
);
char
name
[
size
+
1
];
cursor
->
getText
(
cursor
,
0
,
name
,
size
+
1
);
int64_t
age
;
cursor
->
getInt64
(
cursor
,
1
,
&
age
);
// 释放谓词实例
predicates
->
destroy
(
predicates
);
// 释放结果集
cursor
->
destroy
(
cursor
);
```
5.
删除数据库。
调用OH_Rdb_DeleteStore方法,删除数据库及数据库相关文件。示例代码如下:
```
js
// 释放数据库实例
OH_Rdb_CloseStore
(
store_
)
// 删除
OH_Rdb_DeleteStore
(
&
config
)
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录