From 05c8ce5d8941520aa10e586a253312917b2a8e10 Mon Sep 17 00:00:00 2001 From: mangtsang Date: Tue, 21 Dec 2021 21:47:15 +0800 Subject: [PATCH] add storage docs Signed-off-by: mangtsang --- zh-cn/device-dev/subsystems/Readme-CN.md | 11 +- .../figure/zh-cn_image_0000001192123772.png | Bin 0 -> 15227 bytes .../subsys-data-relational-database.md | 6 +- .../subsystems/subsys-data-storage-guide.md | 195 ++++++++++++++++++ .../subsys-data-storage-overview.md | 31 +++ .../subsystems/subsys-data-storage.md | 5 + zh-cn/device-dev/subsystems/subsys-data.md | 3 +- zh-cn/device-dev/subsystems/subsys.md | 1 + 8 files changed, 243 insertions(+), 9 deletions(-) create mode 100755 zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001192123772.png mode change 100644 => 100755 zh-cn/device-dev/subsystems/subsys-data-relational-database.md create mode 100755 zh-cn/device-dev/subsystems/subsys-data-storage-guide.md create mode 100755 zh-cn/device-dev/subsystems/subsys-data-storage-overview.md create mode 100755 zh-cn/device-dev/subsystems/subsys-data-storage.md mode change 100644 => 100755 zh-cn/device-dev/subsystems/subsys-data.md mode change 100644 => 100755 zh-cn/device-dev/subsystems/subsys.md diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index 865ade93f4..1978419bb7 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -40,10 +40,13 @@ - [唤醒词识别SDK的开发示例](subsys-aiframework-demo-sdk.md) - [唤醒词识别插件的开发示例](subsys-aiframework-demo-plugin.md) - [唤醒词识别配置文件的开发示例](subsys-aiframework-demo-conf.md) -- [数据管理](subsys-database.md) - - [关系型数据库](subsys-database-relational.md) - - [关系型数据库概述](subsys-database-relational-overview.md) - - [关系型数据库开发指导](subsys-database-relational-guide.md) +- [数据管理](subsys-data.md) + - [关系型数据库](subsys-data-relational-database.md) + - [关系型数据库概述](subsys-data-relational-database-overview.md) + - [关系型数据库开发指导](subsys-data-relational-database-guide.md) + - [轻量级数据存储](subsys-data-storage.md) + - [轻量级数据存储概述](subsys-data-storage-overview.md) + - [轻量级数据存储开发指导](subsys-data-storage-guide.md) - [Sensor服务](subsys-sensor.md) - [Sensor服务子系概述](subsys-sensor-overview.md) - [Sensor服务子系使用指导](subsys-sensor-guide.md) diff --git a/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001192123772.png b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001192123772.png new file mode 100755 index 0000000000000000000000000000000000000000..6b0ac3897c71d9e3ad8fd0194bbd95d53cd04445 GIT binary patch literal 15227 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 EH=SkjR{#J2 literal 0 HcmV?d00001 diff --git a/zh-cn/device-dev/subsystems/subsys-data-relational-database.md b/zh-cn/device-dev/subsystems/subsys-data-relational-database.md old mode 100644 new mode 100755 index 85fe45cec4..cbe417ae57 --- a/zh-cn/device-dev/subsystems/subsys-data-relational-database.md +++ b/zh-cn/device-dev/subsystems/subsys-data-relational-database.md @@ -1,7 +1,5 @@ # 关系型数据库 -- **[关系型数据库概述](subsys-database-relational-overview.md)** - -- **[关系型数据库开发指导](subsys-database-relational-guide.md)** - +- **[关系型数据库概述](subsys-data-relational-database-overview.md)** +- **[关系型数据库开发指导](subsys-data-relational-database-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md b/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md new file mode 100755 index 0000000000..8d3f4e2725 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage-guide.md @@ -0,0 +1,195 @@ +# 轻量级数据存储开发指导 + +## 场景介绍 + +轻量级数据存储功能通常用于保存应用的一些常用配置信息,并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中,这些文件可以持久化地存储在设备上。需要注意的是,应用访问的实例包含文件所有数据,这些数据会一直加载在设备的内存中,直到应用主动从内存中将其移除前,应用可以通过Preferences的API进行数据操作。 + +## 接口说明 + +轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括字符串型、布尔型、整数型、长整型、浮点型、双精度类型和字符串数组。 + +**创建存储实例** + +读取指定文件,将数据加载到Preferences实例,即可创建一个存储实例,用于数据操作。 + +**表 1** 轻量级数据存储实例创建接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| PreferencesHelper | static std::shared_ptr GetPreferences(const std::string &path, int &errCode); | path:应用程序内部数据存储路径。
errCode:错误码。
返回值:轻量级存储实例。 | + +**存入数据** + +通过Put系列方法,可以增加或修改Preferences实例中的数据。 + +**表 2** 轻量级偏好数据库存入接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | int PutInt(const std::string &key, int value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutString(const std::string &key, const std::string &value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutBool(const std::string &key, bool value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutLong(const std::string &key, int64_t value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutFloat(const std::string &key, float value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutDouble(const std::string &key, double value); | key:将要存储的key名称,不能为空。
value:将要存储的value。
返回值:错误码。 | +| Preferences | int PutStringSet(const std::string &key, const std::set\ &value); | key:将要存储的key名称,不能为空。
value:将要存储的。
返回值:错误码。 | + +**读取数据** + +通过调用Get系列方法,可以读取Preferences中的数据。 + +**表 3** 轻量级数据读取接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | bool GetBool(const std::string &key, bool defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | std::string GetString(const std::string &key, const std::string &defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | bool GetBool(const std::string &key, bool defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | float GetFloat(const std::string &key, float defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | double GetDouble(const std::string &key, double defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | int64_t GetLong(const std::string &key, int64_t defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | +| Preferences | std::set\ GetStringSet(const std::string &key, std::set\ &defValue); | key:要获取的存储key名称,不能为空。
defValue:若获取失败或value不存在返回此默认值。
返回值:value。 | + +**数据持久化** + +通过执行flush或者flushSync方法,应用可以将缓存的数据再次写回文本文件中进行持久化存储。 + +**表 5** 轻量级数据数据持久化接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | void Flush(); | 将Preferences实例通过异步线程回写入文件中。 | +| Preferences | int FlushSync(); | 将Preferences实例通过同步线程回写入文件中,并返回错误码。 | + +**订阅数据变化** + +订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,PreferencesObserver被回调。 + +**表 5** 轻量级数据变化订阅接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| Preferences | void RegisterObserver(std::shared_ptr preferencesObserver); | preferencesObserver:需要订阅的回调对象实例。 | +| Preferences | void UnRegisterObserver(std::shared_ptr preferencesObserver); | preferencesObserver:需要注销订阅的回调对象实例。 | + +**删除数据文件** + +通过调用以下两种接口,可以删除数据实例或对应的文件。 + +**表 6** 轻量级数据存储删除接口 + +| 类名 | 方法名 | 描述 | +| --- | ----- | ----| +| PreferencesHelper | int DeletePreferences(const std::string &path); | 将Preferences实例从内存中移除,同时删除其在设备上的持久化文件。path:应用程序内部数据存储路径。
返回值:错误码。 | +| PreferencesHelper | int RemovePreferencesFromCache(const std::string &path); | 仅将Preferences实例从内存中移除。path:应用程序内部数据存储路径。
返回值:错误码。 | + +## 开发步骤 + +1. 准备工作,引入preferences以及相关的头文件到开发环境。 + + ``` C++ + 头文件路径://distributeddatamgr_appdatamgr/interfaces/innerkits/native_preferences/include + ``` + +2. 获取Preferences实例。 + + 读取指定文件,将数据加载到Preferences实例,用于数据操作。 + + ``` C++ + int errCode = E_OK; + Preferences pref = PreferencesHelper::GetPreferences(PREF_TEST_PATH + "test.xml", errCode); // PREF_TEST_PATH须为应用沙箱路径。 + EXPECT_EQ(errCode, E_OK); + ``` + + +3. 存入数据。 + + 使用Preferences put方法保存数据到缓存的实例中。 + + ```C++ + pref->PutString("test", "remove"); + ``` + +4. 读取数据。 + + 使用Preferences get方法读取数据。 + + ``` C++ + std::string ret = pref->GetString("test", "defaultValue"); + EXPECT_EQ(ret, "remove"); + ``` + + +5. 数据持久化。 + + 应用存入数据到Preferences实例后,可以通过flush或者flushSync方法将Preferences实例回写到文件中。 + + ```C++ + int err = pref->FlushSync(); + EXPECT_EQ(ret, E_OK); + ``` + + +6. 订阅数据变化。 + + 应用订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush或者flushSync方法时,PreferencesObserver被触发回调。不再需要PreferencesObserver时请注销。 + + 自定义类,实现PreferencesObserver接口: + ``` C++ + class PreferencesObserverCounter : public PreferencesObserver { + public: + virtual ~PreferencesObserverCounter(); + void OnChange(Preferences &preferences, const std::string &key) override; + + std::atomic_int notifyTimes; + static const std::vector NOTIFY_KEYS_VECTOR; + }; + + PreferencesObserverCounter::~PreferencesObserverCounter() {} + + void PreferencesObserverCounter::OnChange(Preferences &preferences, const std::string &key) + { + for (auto it = NOTIFY_KEYS_VECTOR.cbegin(); it != NOTIFY_KEYS_VECTOR.cend(); it++) { + if (key.compare(*it)) { + notifyTimes++; + break; + } + } + } + + const std::vector PreferencesObserverCounter::NOTIFY_KEYS_VECTOR = { PreferencesTest::KEY_TEST_INT_ELEMENT, + PreferencesTest::KEY_TEST_LONG_ELEMENT, PreferencesTest::KEY_TEST_FLOAT_ELEMENT, + PreferencesTest::KEY_TEST_BOOL_ELEMENT, PreferencesTest::KEY_TEST_STRING_ELEMENT }; + ``` + + 订阅数据变化,并触发执行回调方法: + ``` C++ + std::shared_ptr counter = + std::shared_ptr(new PreferencesObserverCounter()); + pref->RegisterObserver(counter); // 注册数据变化的回调。 + + pref->PutString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "test"); + pref->Flush(); // 触发执行counter的onChanged回调方法。 + EXPECT_EQ(static_cast(counter.get())->notifyTimes, 1); + + /* same value */ + pref->PutInt(PreferencesTest::KEY_TEST_INT_ELEMENT, 2); + pref->PutString(PreferencesTest::KEY_TEST_STRING_ELEMENT, "test"); + pref->Flush(); + EXPECT_EQ(static_cast(counter.get())->notifyTimes, 2); + + pref->UnRegisterObserver(counter); // 注销注册数据变化的回调。 + ``` + + +7. 删除指定文件。 + + 从使用PreferencesHelper内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。删除后,数据及文件将不可恢复。 + + ``` C++ + pref = nullptr; + int ret = PreferencesHelper::DeletePreferences("/data/test/test"); + EXPECT_EQ(ret, E_OK); + ``` + + diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md b/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md new file mode 100755 index 0000000000..a4830a9c80 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage-overview.md @@ -0,0 +1,31 @@ +# 轻量级数据存储概述 + +轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用获取某个轻量级存储对象后,该存储对象中的数据将会被缓存在内存中,以便应用获得更快的数据存取速度。应用也可以将缓存的数据再次写回文本文件中进行持久化存储,由于文件读写将产生不可避免的系统资源开销,建议应用减少对持久化文件的读写频率。 + +## 基本概念 + +- **Key-Value数据结构** + + 一种键值结构数据类型。Key是不重复的关键字,Value是数据值。 + +- **非关系型数据库** + + 区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系。 + + +## 运作机制 + +1. 应用通过指定Preferences文件将其中的数据加载到Preferences实例,系统会通过静态容器将该实例存储在内存中,同一应用或进程中每个文件仅存在一个Preferences实例,直到应用主动从内存中移除该实例或者删除该Preferences文件。 +2. 应用获取到Preferences文件对应的实例后,可以从Preferences实例中读取数据,或者将数据存入Preferences实例中。通过调用flush或者flushSync方法可以将Preferences实例中的数据回写到文件里。 + +**图 1** 轻量级数据存储运作机制 + + +![](figure/zh-cn_image_0000001192123772.png) + +## 约束与限制 + +- 因Preferences实例会加载到内存中,建议存储的数据不超过一万条,并及时清理不再使用的实例,以便减少非内存开销。 +- 数据中的key为string类型,要求非空且字符长度不超过80个。 +- 当数据中的value为string类型时,允许为空,字符长度不超过8192个。 + diff --git a/zh-cn/device-dev/subsystems/subsys-data-storage.md b/zh-cn/device-dev/subsystems/subsys-data-storage.md new file mode 100755 index 0000000000..62031452c5 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-data-storage.md @@ -0,0 +1,5 @@ +# 轻量级数据存储 + +- **[轻量级数据存储概述](subsys-data-storage-overview.md)** + +- **[轻量级数据存储开发指导](subsys-data-storage-guide.md)** diff --git a/zh-cn/device-dev/subsystems/subsys-data.md b/zh-cn/device-dev/subsystems/subsys-data.md old mode 100644 new mode 100755 index 1496910995..5e1f5fb276 --- a/zh-cn/device-dev/subsystems/subsys-data.md +++ b/zh-cn/device-dev/subsystems/subsys-data.md @@ -1,5 +1,6 @@ # 数据管理 -- **[关系型数据库](subsys-database-relational.md)** +- **[关系型数据库](subsys-data-relational-database.md)** +- **[轻量级数据存储](subsys-data-storage.md)** diff --git a/zh-cn/device-dev/subsystems/subsys.md b/zh-cn/device-dev/subsystems/subsys.md old mode 100644 new mode 100755 index aa174c8457..5c874980f0 --- a/zh-cn/device-dev/subsystems/subsys.md +++ b/zh-cn/device-dev/subsystems/subsys.md @@ -4,6 +4,7 @@ - **[分布式远程启动](subsys-remote-start.md)** - **[图形图像](subsys-graphics.md)** - **[媒体](subsys-multimedia.md)** +- **[数据管理](subsys-data.md)** - **[公共基础](subsys-utils.md)** - **[AI框架](subsys-aiframework.md)** - **[Sensor服务](subsys-sensor.md)** -- GitLab