[文章]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<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
  3.     List<String> 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<String, Integer> 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. 恭喜你      
通过本教程的学习,你已经学会了分布式数据库服务的基础操作(创建、新增、删除、同步)。



回帖

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