HarmonyOS数据存储
学习鸿蒙合法时,作为中工的一名门生,本学期学习了鸿蒙开发课程,学习了数据存储,现在总结一下,检验一下自己所学。下面把该学习内容总结一下,希望对学习鸿蒙开发的小伙伴提供一些参考。
1. 概述
1.1数据存储的目的
在移动应用开发中,数据存储至关告急。它确保应用程序的数据可以或许长期化,即数据在应用关闭或装备重启后不会丢失。通过将数据存储在外存中,应用可以实现数据的生存和共享,满足用户的各种需求,比方生存用户的设置、记录应用的利用汗青、存储用户天生的内容等。
1.2鸿蒙数据存储方式
- 本地存储
- 本地存储是一种将应用数据存储在应用所在装备本地的方式。这种方式适用于数据不必要在多个装备之间共享的情况,比方应用的一些本地配置信息、用户在本地装备上的操作记录等。它的优点是数据访问速度快,因为数据不必要通过网络传输,直接在本地装备上进行读写操作。
- 分布式存储
- 分布式存储则是将应用数据分布在多个装备上。这使得应用可以在不同装备之间实现数据的共享和同步。比方,用户在一个装备上修改了应用的某些数据,这些修改可以主动同步到其他关联装备上,为用户提供无缝的利用体验。这种方式适用于必要在多个装备之间协同工作的应用,如条记应用、文件管理应用等,用户可以在不同装备上随时获取最新的数据。
1.3相干管理框架和服务
- 方舟数据管理(ArkData)
- ArkData 为开发者提供了全面的数据存储和管理能力。它涵盖了多种数据存储方式的管理,包罗首选项存储管理、关系型数据存储管理、键值型数据存储管理、数据对象存储管理、跨应用数据管理和统一数据管理框架。
- 首选项存储管理用于处理轻量级的配置数据,如应用的主题设置、语言偏好等。关系型数据存储管理则针对必要复杂数据布局和关系处理的应用,提供了关系型数据库的操作能力。键值型数据存储管理适用于以键值对形式存储的数据,具有高效的读写性能。数据对象存储管理方便对对象型布局数据进行操作。跨应用数据管理实现了不同应用之间的数据交互,而统一数据管理框架则提供了统一的标准和接口,确保数据在不同应用和装备之间的高效交互和管理。
- 数据管理服务(DatamgrService)
- DatamgrService 在数据存储中起到了关键作用。它提供了部件的同步、跨应用、跨装备的数据共享管理等服务。比方,当应用的某个组件必要与其他组件或其他应用共享数据时,DatamgrService 可以调和数据的传输和同步,确保数据的同等性和完整性。它还负责处理跨装备的数据同步,使得在分布式存储情况下,数据可以或许在不同装备之间准确无误地进行更新和共享。
1.4不同类型数据存储先容
- 首选项存储(Preferences)
- 功能特点:首选项存储提供了一种轻量级的配置数据长期化方式。它重要用于生存应用的一些简单配置信息和用户偏好设置,如登录账户暗码、应用的字体大小设置、是否开启某些功能的开关状态等。这种存储方式的优点是简单易用,访问速度快,可以或许快速地读取和写入少量的数据。
- 存储机制:它仅支持本地存储,数据最终存储在操作体系的文件中。体系对底层文件的读写进行了封装,并将底层文件映射成 Preferences 实例对象。每个底层文件对应一个 Preferences 实例,应用通过 Preferences 提供的接口方法来进行数据的读写操作。
- 关系型数据存储(RelationalStore)
- 数据库布局:关系型数据存储基于关系型数据库模型,以二维表的形式组织和存储数据。在这种模型中,数据被存储在多个相干联的表中,每个表包罗行和列,行代表数据记录,列代表数据的不同属性。比方,一个用户信息表可能包罗用户 ID、用户名、暗码、年龄等列。
- 功能特性:它提供了丰富的数据库操作功能,包罗增删改查、加密、备份以及订阅通知等。支持本地存储和分布式存储,通过与 DatamgrService 协作,可以实现分布式跨装备数据同步。这使得在多个装备上利用的应用可以或许保持数据的同等性。
- 键值型数据存储(KVStore)
- 数据模型:基于 KV(Key Value)数据模型,其中键是数据的唯一标识,值代表数据内容。键通常为字符串类型,而值可以是多种类型,包罗字符串、数值、布尔、数组等。比方,一个存储用户设置的 KV 数据库可能有键为 "font_size",值为 "16" 表示字体大小为 16 像素。
- 性能上风:KV 数据存储在读写性能上表现出色,特别是在分布式场景中,它低落了解决数据库辩说的复杂度,更得当分布式情况下的数据存储。它同样支持本地存储和分布式存储,并通过相干服务实现跨装备数据同步。
- 数据对象存储(DataObject)
- 数据布局支持:提供了对对象型布局数据的读写和管理能力。这种存储方式适用于处理复杂的对象数据,比方在一个图形绘制应用中,每个图形对象可能包罗多个属性和方法,数据对象存储可以方便地对这些图形对象进行存储和操作。
- 存储范围:支持本地存储和分布式存储,使得应用在不同装备上都可以或许对对象型数据进行有效的管理。
- 跨应用数据管理(DataShare)
- 交互能力:提供了数据提供者 provider、数据消费者 consumer 以及同装备跨应用数据交互的增、删、改、查以及订阅通知等能力。它不与任何特定的数据库绑定,可以机动地对接关系型数据库、键值型数据库等不同类型的存储方式,实现不同应用之间的数据共享和交互。
- 应用场景:比方,一个应用可能必要获取另一个应用中的某些用户信息,通过 DataShare 可以方便地实现这种跨应用的数据获取和操作。
- 统一数据管理框架(UDMF)
- 标准订定:提供了数据跨应用、跨装备交互的标准,定义了在跨应用和跨装备数据交互过程中利用的数据语言。这确保了不同应用和装备之间可以或许以统一的方式理解和处理数据,提高了数据交互的服从。
- 安全与管理:提供安全、标准化的数据流通通路,支持不同级别的数据访问权限与生命周期管理策略。通过对数据访问权限的精致控制,可以掩护数据的安全性和隐私性,同时公道管理数据的生命周期,确保数据在不同阶段都能得到正确的处理。
1.5底层存储技术
在 HarmonyOS 底层,利用了多种技术进行长期化存储和管理。其中包罗 XML 用于存储一些布局化的数据,文件存储用于生存各种类型的文件,SQLite 数据库管理体系则用于处理关系型数据。这些底层技术通过数据管理服务及应用访问 API 为上层应用提供了数据存储功能。比方,应用可以通过相应的 API 调用底层的 SQLite 数据库进行关系型数据的操作,或者利用文件存储 API 来读写文件。
2. 首选项数据存储
2.1适用场景和特点
- 也称为偏好数据存储或轻量级数据存储,得当于少量的数据存储,如登录账户暗码、配置信息等。
- 具有访问速度快,存取服从高的特点。
2.2存储位置和访问机制
- 数据最终存储在操作体系的文件中,体系提供对底层文件读写的封装,并把底层文件映射成 Preferences 实例对象。
- 每一个底层文件对应一个 Preferences 实例,应用可以借助 Preferences 提供的接口方法,进行读写数据。
2.3数据布局
接纳键值对(Key - Value)布局进行数据存取操作,同一个键在存储文件中只会对应一个值。
- Key:为字符串类型,长度不能凌驾 1024 个字符,非空字符串,不重复。
- Value:可以为 number、string、boolean、Array<number>、Array<string>、Array<boolean>、Uint8Array、object、bigint。当 Value 值为 string 类型,要求利用 UTF - 8 编码,其值不为空时长度不能凌驾 16MB。
2.4内存管理
Preferences 实例包罗文件所有数据,数据会一直加载在装备的内存中,直到应用主动从内存中将其移除。因此一样平常不得当大批量数据存取,一样平常发起万条级别以下。
2.5代码示例
- 导入模块
在应用开发中,利用首选项存储必要导入@kit.ArkData模块。
- 创建 / 删除 Preferences 实例及文件的函数接口
- // 获得Preserences实例,名字作为参数,如果不存在存储文件,则会创建,用Promise方式
- getPreferences(context: Context, name: string): Promise<Preferences>;
- // 功能同上,采用回调方式
- getPreferences(context: Context, name: string, callback: AsyncCallback<Preferences>): void;
- // 获得Preserences实例,如果不存在存储文件,则会创建,采用Promise方式,options为相关的配置参数
- getPreferences(context: Context, options: Options): Promise<Preferences>;
- // 功能同上,采用回调方式
- getPreferences(context: Context, options: Options, callback: AsyncCallback<Preferences>): void;
- // 功能同上,该接口为同步接口
- getPreferencesSync(context: Context, options: Options): Preferences;
- // 删除缓存中的Preserences实例,采用Promise方式,名字作为参数
- removePreferencesFromCache(context: Context, name: string): Promise<void>;
- // 功能同上,采用回调方式
- removePreferencesFromCache(context: Context, name: string, callback: AsyncCallback<void>): void;
- // 删除缓存中的Preserences实例,采用Promise方式,options为相关的配置参数
- removePreferencesFromCache(context: Context, options: Options): Promise<void>;
- // 功能同上,采用回调方式
- removePreferencesFromCache(context: Context, options: Options, callback: AsyncCallback<void>): void;
- // 功能同上,该接口为同步接口
- removePreferencesFromCacheSync(context: Context, options: Options):void;
- // 删除偏好存储,包括删除缓存和存储文件,采用Promise方式,名字作为参数
- deletePreferences(context: Context, name: string): Promise<void>;
- // 功能同上,采用回调方式
- deletePreferences(context: Context, name: string, callback: AsyncCallback<void>): void;
- // 功能同上,采用Promise方式,options作相关的配置参数
- deletePreferences(context: Context, options: Options): Promise<void>;
- // 功能同上,采用回调方式
- deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void;
复制代码
- 数据管理操作接口
在得到 Preferences 实例后,可以通过接口方法进行数据管理操作。
- // 向Preferences实例中添加键值对,ValueType可以是number、string、boolean、Array<number>、Array<string>、Array<boolean>类型,采用Promise方式
- put(key: string, value: ValueType): Promise<void>;
- // 功能同上,采用回调方式
- put(key: string, value: ValueType, callback: AsyncCallback<void>): void;
- // 功能同上,该方法为同步方法
- putSync(key: string, value: ValueType): void;
- // 获取键key对应的值,不存在时采用默认值defaultValue,采用Promise异步回调
- get(key: string, defaultValue: ValueType): Promise<ValueType>;
- // 功能同上,回调方式
- get(key: string, defaultValue: ValueType, callback: AsyncCallback<ValueType>): void;
- // 功能同上,该方法为同步方法
- getSync(key: string, defaultValue: ValueType): ValueType;
- // 获得所有的键值对,采用Promise异步回调
- getAll(): Promise<object>;
- // 功能同上,回调方式
- getAll(callback: AsyncCallback<Object>): void;
- // 功能同上,该方法为同步方法
- getAllSync(): Object;
- // 检查缓存的Preferences实例中是否包含名为给定Key的存储键值对,采用Promise异步回调。该功能还有回调方式和同步方法
- has(key: string): Promise<boolean>;
- // 删除指定的键值对,采用Promise异步回调。该功能同样存在回调方式和同步方法。
- delete(key: string): Promise<void>;
- // 删除缓存中所有键值对,采用Promise异步回调。该功能同样存在回调方式和同步方法。
- clear(): Promise<void>;
- // 将缓存中所有的键值对保存到文件,采用Promise异步回调
- flush(): Promise<void>;
- // 功能同上,回调方式
- flush(callback: AsyncCallback<void>): void;
- // 订阅数据变更,订阅的Key的值发生变更后,在执行flush方法后,触发callback回调
- on(type: 'change', callback: Callback<{ key : string }>): void;
- // 取消订阅数据变更
- off(type: 'change', callback: Callback<{ key : string }>): void;
复制代码 3. 关系型数据存储
3.1数据库布局
关系型数据库(Relational Database,RDB)是基于关系模型组织管理数据的数据库。其中一样平常包罗若干个二维的数据表,每个表中以行和列的形式存储数据。
3.2底层存储引擎
鸿蒙关系型数据存储底层利用 SQLite 作为长期化存储引擎,支持 SQLite 的所有数据库特性,包罗事件、索引、视图、触发器、外键、参数化查询和预编译 SQL 语句等。
3.3框架封装
鸿蒙关系型数据存储框架实现了对底层 SQLite 数据进一步封装,对上层提供通用、美满且高效操作接口,包罗一系列的增、删、改、查等。
3.4代码示例
- 导入模块
关系型数据库的应用程序接口定义在@kit.ArkData中,因此利用时必要导入该模块:
- import { relationalStore } from '@kit.ArkData';
复制代码
- // 获得数据库存储对象,当数据库不存在时创建数据库,数据库配置由config给出,采用回调方式返回
- getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void;
- // 功能同上,采用Promise方式返回
- getRdbStore(context: Context, config: StoreConfig): Promise<RdbStore>;
- // 删除数据库,采用回调方式返回
- deleteRdbStore(context: Context, name: string, callback: AsyncCallback<void>): void;
- // 删除数据库,采用Promise方式返回
- deleteRdbStore(context: Context, name: string): Promise<void>;
- // 删除数据库,API10后提供的新接口
- deleteRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<void>): void;
- // 删除数据库,API10后提供的新接口
- deleteRdbStore(context: Context, config: StoreConfig): Promise<void>;
复制代码
- // 向数据库表插入数据。参数table代表待插入数据的表名;values为插入的ValuesBucket类型数据,内部是键值对形式。以回调方式返回
- insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void;
- // 功能同上,以Promise方式返回
- insert(table: string, values: ValuesBucket):Promise<number>;
- // 功能同上,API10后增加的接口,conflict为冲突解决模式
- insert(table: string, values: ValuesBucket, conflict: ConflictResolution, callback: AsyncCallback<number>):void;
- // 功能同上,以Promise方式返回
- insert(table: string, values: ValuesBucket, conflict: ConflictResolution):Promise<number>;
- // 功能同上,API12后增加的同步执行接口
- insertSync(table: string, values: ValuesBucket, conflict?: ConflictResolution):number;
- // 根据条件删除数据,条件由predicates给出,RdbPredicates类型封装了SQL的条件,以回调方式返回
- delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void;
- // 功能同上,以Promise方式返回
- delete(predicates: RdbPredicates):Promise<number>;
- // 功能同上,API12后增加的同步执行接口
- deleteSync(predicates: RdbPredicates):number;
- // 更新数据,更新的数据由values给出,条件由predicates给出,以Promise方式返回,同样存在回调方式的接口
- update(values: ValuesBucket, predicates: RdbPredicates):Promise<number>;
- // 功能同上,API10后增加的接口,conflict为冲突解决模式
- update(values: ValuesBucket, predicates: RdbPredicates, conflict: ConflictResolution):Promise<number>;
- // 功能同上,API12后增加的同步执行接口
- updateSync(values: ValuesBucket, predicicates: RdbPredicates, conflict?: ConflictResolution):number;
- // 查询数据,条件由predicates给出,查询的表列名由columns给出,以回调方式返回
- query(predicates: RdbPredicates, callback: AsyncCallback<ResultSet>):void;
- // 功能同上,以Promise方式返回
- query(predicates: RdbPredicates, columns?: Array<string>):Promise<ResultSet>;
- // 功能同上,API12后增加的同步执行方式
- querySync(predicates: RdbPredicates, columns?: Array<string>):ResultSet;
- // 执行SQL语句,根据SQL语句查询数据库中的数据,以回调方式返回
- querySql(sql: string, callback: AsyncCallback<ResultSet>):void;
- // 执行包含指定参数但不返回值的SQL语句
- executeSql(sql: string, callback: AsyncCallback<void>):void;
- // 功能同上,API12后增加的同步执行接口
- querySqlSync(sql: string, bindArgs?: Array<ValueType>):ResultSet;
复制代码 4. 键值型数据存储
4.1数据库模型
键值型数据存储是基于 KV(Key Value)数据模型的数据库存储。KV 数据模型中的键是数据的唯一标识,值一样平常代表数据内容。键接纳字符串类型,值可以是字符串、数值、布尔、数组等类型。
4.2在鸿蒙中的抽象和管理
在 HarmonyOS 应用中,KV 数据库被抽象成了 KVStore,由 KVManager 进行管理。KVStore 提供通过 put 进行数据的写操作,即把 KV 键值对写入到数据库中,通过 get 进行数据的读操作。
4.3数据库类型和限制
- 数据库类型:目前分为单版本数据库和装备协同数据库两种类型,两者的区别在分布式存储时不同。
- 限制条件
- 针对单版本数据库,每条记录 Key 长度≤1 KB,Value 的长度 < 4 MB。
- 针对装备协同数据库,每条记录 Key 的长度≤896 Byte,Value 的长度 < 4 MB。
- 每个应用程序最多支持同时打开 16 个 KV 数据库。
- KV 数据库变乱回调方法中不允许进行壅闭操作,如修改界面组件等。
4.4代码示例
- import { distributedKVStore } from '@kit.ArkData';
复制代码
- // 根据指定的storeId和options,创建并得到一个KVStore实例,用于数据操作。根据options中的kvStoreType的不同,可以创建SingleKVStore或DeviceKVStore实例,T为泛型,可以是SingleKVStore或DeviceKVStore
- getKVStore<T>(storeId: string, options: Options, callback: AsyncCallback<T>): void;
- // 同上,以Promise方式返回
- getKVStore<T>(storeId: string, options: Options): Promise<T>;
- // 关闭appId和storeId对应的键值数据库,appId为应用的包名, storeId是数据库的唯一标识
- closeKVStore(appId: string, storeId: string, callback: AsyncCallback<void>): void;
- // 同上,以Promise方式返回
- closeKVStore(appId: string, storeId: string): Promise<void>;
- // 删除appId和storeId对应的键值数据库
- deleteKVStore(appId: string, storeId: string, callback: AsyncCallback<void>): void;
- // 同上,以Promise方式返回
- deleteKVStore(appId: string, storeId: string): Promise<void>;
复制代码
- // 向数据库中添加一条记录,即指定类型的键值对,如果键已存在,则修改其对应的值
- put(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback<void>): void;
- // 同上,以Promise方式返回
- put(key: string, value: Uint8Array | string | number | boolean): Promise<void>;
- // 向数据库批量添加数据
- putBatch(entries: Entry[], callback: AsyncCallback<void>): void;
- // 同上,以Promise方式返回
- putBatch(entries: Entry[]): Promise<void>;
- // 从指定的数据库中获取指定键对应的值
- get(key: string, callback: AsyncCallback<boolean | string | number | Uint8Array>): void;
- // 同上,以Promise方式返回
- get(key: string): Promise<boolean | string | number | Uint8Array>;
- // 从数据库中删除指定键值对数据
- delete(key: string, callback: AsyncCallback<void>): void;
- // 同上,以Promise方式返回
- delete(key: string): Promise<void>;
复制代码 5. 分布式数据管理
5.1先容
分布式数据管理是鸿蒙体系中一项告急的特性,它允许同一 HarmonyOS 应用的数据分布存储在多个装备上。这种方式使得跨装备应用可以或许更高效地利用跨装备的数据查询、修改、同步等功能,为用户提供了无缝的多装备体验。比方,用户在手机上修改了一份文档,该修改可以主动同步到用户的平板电脑或其他智能装备上,方便用户在不同装备上继承工作。
5.2同等性类型
- 强同等性
- 含义:某一装备成功修改数据后,组网内装备对该数据的读取操作立即得到更新后的值。
- 应用场景:适用于对数据及时性和同等性要求极高的应用,如金融交易体系。在这种场景下,任何装备上的数据更新都必须立即在所有相干装备上反映出来,以确保交易的准确性和安全性。
- 弱同等性
- 含义:某一装备成功修改数据后,组网内装备可能读取到本次更新后的数据,也可能读取不到,不能确定多长时间可以使得各个装备的数据同步同等。
- 应用场景:一些对数据及时性要求不是特别高的应用,如社交媒体的某些非关键信息更新。比方,用户在某一装备上更新了自己的个人简介,其他装备上的用户可能不会立即看到更新,但最终会在一段时间后看到同等的数据。
- 最终同等性
- 含义:某一装备成功修改数据后,在某个时间窗口之后组网内装备的数据可以或许达到最终的同等状态。
- 应用场景:适用于大多数普通的分布式应用场景,如文件同步工具。用户在一个装备上修改了文件,经过一段时间(可能是几分钟到几小时不等,取决于网络状况和体系设置)后,其他装备上的文件会主动更新为最新版本。
5.3分布式数据库类型
- 分布式键值型数据库
- 存储布局:以键值对形式存储数据,可以实现数据长期化,可以实现本地存储和跨装备同步。这种简单的布局使得在分布式情况下数据的管理和传输相对容易。
- 数据隔离方式:分为单版本数据库和多装备协同数据库。单版本数据库中数据全局唯一,多装备协同数据库通过在 Key 前面拼接装备 ID 实现数据隔离。
- 应用场景:适用于存储一些配置信息、用户偏好设置等简单的数据布局,这些数据在不同装备上可能必要共享和同步。比方,用户的应用主题设置、语言偏好等。
- 分布式关系型数据库
- 存储布局:以关系型二维表形式存储数据,可以实现长期化,可以实现本地应用存储和跨装备同步。关系型数据库的布局使得它可以或许处理复杂的数据关系,适用于存储一些具有关联关系的数据。
- 应用场景:比方企业的客户关系管理体系(CRM),必要存储客户信息、订单信息、产物信息等,并且这些信息之间存在复杂的关联关系。在分布式情况下,不同的分支机构或员工可以通过不同的装备访问和更新这些数据。
- 分布式数据对象
- 存储布局:分布式内存数据库的 JS 对象型的封装,能像操作本地变量一样操作分布式数据对象,数据的跨装备同步由体系主动完成。这种方式提供了一种更高级的抽象,使得开发者可以更方便地处理分布式数据。
- 应用场景:适用于一些对数据操作的便捷性要求较高的场景,如及时协作的应用程序。开发者可以像操作本地对象一样操作分布式数据对象,无需过多关注底层的同步和存储细节。
5.4分布式键值型数据管理
- 数据库类型
- 分布式键值型数据库在提供分布式能力的基础上,分为单版本数据库和多装备协同数据库,其原理和应用场景与上述先容雷同。
- 同步方式
- 手动同步
- 触发方式:由应用程序调用同步接口(sync)来触发。
- 同步参数:同步时必要指定同步的装备列表和同步模式。同步模式分为:
- PULL_ONLY(将远端数据拉到本端):适用于本端数据可能已经过期,必要从远端获取最新数据的场景。比方,用户长时间未利用某一装备,再次利用时必要从其他装备拉取最新的应用配置数据。
- PUSH_ONLY(将本端数据推送到远端):适用于本端数据已经更新,必要将更新后的数据推送到其他装备的场景。比如,用户在手机上修改了应用的设置,必要将这些设置推送到平板电脑上。
- PUSH_PULL(同时进行推拉):适用于不确定本端和远端数据的准确性,必要同时进行数据的推送和拉取的场景。比方,在一个多人协作的应用中,不同装备上的用户可能同时对数据进行了修改,必要通过这种方式确保数据的同等性。
- 主动同步
- 触发机制:由分布式数据库在底层主动完成同步,同步包罗将本端数据推送其他装备,同时将远端数据拉取到本端。
- 同步时机:一样平常选择装备上线、应用程序更新数据时,主动同步不必要应用主动调用同步接口(sync)。这种方式可以确保数据在装备状态变化或应用数据更新时主动保持同步,提高了用户体验。
- 数据变化通知机制
- 本地数据变化:对于本地的数据,数据库中的数据发生变化后,再次访问数据会读取到新的数据。对于对数据及时变化要求较高的应用,可以通过订阅数据及时得到数据变化通知,本地装备的应用内容订阅数据变化可以通过订阅接口(on)实现。比方,在一个本地的日记应用中,当用户修改了某一篇日记的内容,再次打开该日记时可以或许看到最新的内容,并且假如应用订阅了数据变化通知,相干的模块(如显示日记列表的模块)可以及时更新显示。
- 分布式数据变化:分布式数据存储往往支撑着跨装备的分布式应用,当应用在某一装备上进行数据增、删、改等修改数据时,同一应用订阅组网内的其他装备会收到订阅的数据变化通知。比方,在一个分布式的文件共享应用中,当用户在一个装备上上传了一个新文件,其他订阅了该应用数据变化的装备会收到通知,并可以及时更新文件列表显示。
- 数据安全机制
- 分布式数据管理对数据实施分类分级掩护,提供基于数据安全标签和装备安全等级的访问控制机制。数据安全标签和装备安全等级越高,加密措施和访问控制措施越严酷。
- 数据同步规则为,本装备的数据安全标签不高于对端装备的装备安全等级时,数据才华从本装备同步到对端装备,否则不能同步。比方,假如本装备的安全等级为 SL2,对端装备的安全等级为 SL3,且数据的安全标签为 S2,则数据可以同步;但假如数据的安全标签为 S3,则无法同步。
- 同步权限
- 应用在利用分布式数据库时,必要申请分布式数据同步权限,即 ohos.permission.DISTRIBUTED_DATASYNC 权限。
- 申请方法:
- 在配置文件(module.json5)配置相干权限信息。
- 通过 requestPermissionsFromUser()哀求用户同意。比方,在应用启动时,可以弹出权限哀求对话框,向用户说明必要该权限的原因,并哀求用户同意授权。
- 开发接口
- 分布式数据库存储除了基本的读写外,还提供的数据同步、订阅等接口。
- // 在手动模式下,触发数据库同步
- sync(deviceIds: string[], mode: SyncMode, delayMs?: number): void {
- // 这里可以添加具体的同步逻辑,例如根据deviceIds找到对应的设备,根据mode设置同步模式,根据delayMs设置延迟时间
- // 然后执行同步操作,可能涉及到网络通信、数据传输和更新等步骤
- }
- // 订阅数据变化
- on(event: 'dataChange', type: SubscribeType, listener: Callback<ChangeNotification>): void {
- // 这里可以添加订阅逻辑,例如将listener添加到一个订阅列表中,当数据发生变化时,遍历订阅列表并调用相应的listener
- }
- // 订阅数据同步完成
- on(event: 'syncComplete', syncCallback: Callback<Array<[ string, number ]>>): void {
- // 这里可以添加订阅逻辑,类似于订阅数据变化的逻辑,当数据同步完成时,调用syncCallback
- }
- // 取消订阅数据变化通知
- off(event: 'dataChange', listener?: Callback<ChangeNotification>): void {
- // 这里可以添加取消订阅的逻辑,例如从订阅列表中移除对应的listener
- }
- // 取消订阅数据同步完成通知
- off(event: 'syncComplete', syncCallback?: Callback<Array<[ string, number ]>>): void {
- // 这里可以添加取消订阅的逻辑,类似于取消订阅数据变化通知的逻辑
- }
复制代码
- // 创建deviceManager
- devManager = distributedDeviceManager
- .createDeviceManager(context?.applicationInfo.name);
- // 获得设备列表
- let devices = devManager.getAvailableDeviceListSync();
- // 这里kvStore为需要同步的数据库实例,要求已经存在
- // 以推拉方式同步数据,最大延迟时间为1000ms
- kvStore?.sync(deviceIds,
- distributedKVStore.SyncMode.PUSH_PULL, 1000);
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |