[文章]HarmonyOS教程—基于分布式数据接口,实现多种设备上一致的数据访问体验

阅读量 0
0
2
1. 如何使用分布式数据库
介绍
分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组,分布式数据服务对属于不同的应用的数据进行隔离,保证不同应用之间的数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上一致的数据访问体验。
有关分布式数据服务更加详细的介绍可以参考分布式数据服务。
本教程将为您完整介绍以下内容并展示完整示例:
  • 分布式数据库的创建
  • 分布式数据库的插入和删除
  • 分布式数据库的数据同步

2. 搭建HarmonyOS环境
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
  • 安装DevEco Studio,详情请参考下载和安装软件。
  • 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
  • 开发者可以参考以下链接,完成设备调试的相关配置:
    • 使用真机进行调试
    • 使用模拟器进行调试

3. 实现分布式数据库需要申请的权限
为了实现分布式数据库,需要在entrysrcmainconfig.json中申请ohos.permission.DISTRIBUTED_DATASYNC权限,以便允许不同设备间的数据交换。
示例代码如下:
  1. module": {
  2. ......
  3. "reqPermissions": [
  4. {
  5. "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  6. }
  7. ]
  8. }
复制代码

4. 如何创建分布式数据库
要创建分布式数据库,首先要做的就是创建分布式数据库管理器实例KvManager,我们定义了如下方法:
  1. private KvManager createManager() {
  2. KvManager manager = null;
  3. try {

  4. KvManagerConfig config = new KvManagerConfig(this);

  5. manager = KvManagerFactory.getInstance().createKvManager(config);
  6. }
  7. catch (KvStoreException exception) {

  8. HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "some exception happen");
  9. }
  10. return manager;
  11. }
复制代码

创建成功后,借助KvManager创建SINGLE_VERSION分布式数据库,方法如下:
  1. private SingleKvStore createDb(KvManager kvManager) {
  2. SingleKvStore kvStore = null;
  3. try {

  4. Options options = new Options();

  5. options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);

  6. kvStore = kvManager.getKvStore(options, STORE_ID);
  7. } catch (KvStoreException exception) {

  8. HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "some exception happen");
  9. }
  10. return kvStore;
  11. }
复制代码

说明
SINGLE_VERSION分布式数据库是指数据在本地保存是以单个KV条目为单位的方式保存,对每个Key最多只保存一个条目项,当数据在本地被用户修改时,不管它是否已经被同步出去,均直接在这个条目上进行修改。
最后是订阅分布式数据库中数据变化,方法如下:
  1. private void subscribeDb(SingleKvStore singleKvStore) {
  2. KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();
  3. singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE, kvStoreObserverClient);
  4. }
复制代码

说明
分布式数据库支持订阅远端和本地的数据变化,示例代码中订阅的方式为订阅远端,订阅本地的参数为SUBSCRIBE_TYPE_LOCAL;同时还支持订阅全部,参数为SUBSCRIBE_TYPE_ALL。

5. 如何进行数据查询、插入和删除
数据插入
在将数据写入分布式数据库之前,需要先构造分布式数据库的Key(键)和Value(值),通过putString方法将数据写入到数据库中,具体示例如下:
  1. private void writeData(String key, String value) {
  2. if (key == null || key.isEmpty() || value == null || value.isEmpty()) {
  3. return;
  4. }
  5. singleKvStore.putString(key, value);
  6. }
复制代码

数据查询
分布式数据库中的数据查询是根据Key(键)来进行的,如果指定Key(键),则会查询出对应Key(键)的数据;如果不指定Key,既为空,则查询出所有数据,查询示例代码如下
  1. private void queryContact() {
  2. List entryList = singleKvStore.getEntries("");
  3. contactArray.clear();
  4. try {

  5. for (Entry entry : entryList) {

  6. contactArray.add(new Contacter(entry.getValue().getString(), entry.getKey()));

  7. }
  8. } catch (KvStoreException exception) {

  9. HiLog.info(LABEL_LOG, LOG_FORMAT,TAG,"the value must be String");
  10. }
  11. contactAdapter.notifyDataChanged();
  12. }
复制代码

说明
以上代码除查询外,还有部分场景业务代码。
数据删除
对于分布式数据库的删除操作,可以直接调用deleteKvStore()方法,但是需要传递事先定义好的STORE_ID参数(具体定义参考下文完整代码),示例代码如下:
  1. [url=home.php?mod=space&uid=2735960]@Override[/url]
  2. protected void onStop() {
  3. super.onStop();
  4. kvManager.closeKvStore(singleKvStore);
  5. kvManager.deleteKvStore(STORE_ID);
  6. }
复制代码

6. 如何进行分布式数据库的同步
在进行数据同步之前,首先需要先获取当前组网环境中的设备列表,然后指定同步方式(PULL_ONLY,PUSH_ONLY,PUSH_PULL)进行同步,以PUSH_PULL方式为例,示例代码如下:
  1. private void syncContact() {
  2. List deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
  3. List deviceIdList = new ArrayList<>();
  4. for (DeviceInfo deviceInfo : deviceInfoList) {
  5. deviceIdList.add(deviceInfo.getId());
  6. }
  7. HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "device size= " + deviceIdList.size());
  8. if (deviceIdList.size() == 0) {
  9. showTip("组网失败");
  10. return;
  11. }
  12. singleKvStore.registerSyncCallback(new SyncCallback() {
  13. @Override
  14. public void syncCompleted(Map map) {
  15. getUITaskDispatcher().asyncDispatch(new Runnable() {
  16. @Override
  17. public void run() {
  18. queryContact();
  19. showTip("同步成功");
  20. }
  21. });
  22. singleKvStore.unRegisterSyncCallback();
  23. }
  24. });
  25. singleKvStore.sync(deviceIdList, SyncMode.PUSH_PULL);
  26. }
复制代码

说明
以上代码除数据同步外,还有部分场景业务代码。

7. 最终实现效果

新建信息:
43.png

数据库同步过程:
A手机 B手机
完整代码参考请参示例代码。

8. 恭喜你
通过本教程的学习,你已经学会了分布式数据库服务的基础操作(创建、新增、删除、同步)。



回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友