分布式存储

  1. 如何使用分布式数据库

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

分布式数据库的创建
分布式数据库的插入和删除
分布式数据库的数据同步

  1. 实现分布式数据库需要申请的权限

为了实现分布式数据库,需要在entry\src\main\config.json中申请ohos.permission.DISTRIBUTED_DATASYNC权限,以便允许不同设备间的数据交换。示例代码如下:

   "reqPermissions": [ 
     { 
       "name": "ohos.permission.DISTRIBUTED_DATASYNC" 
     } 
  ] 
}
  1. 如何创建分布式数据库

要创建分布式数据库,首先要做的就是创建分布式数据库管理器实例KvManager,我们定义了如下方法:

    KvManager manager = null; 
    try { 
        KvManagerConfig config = new KvManagerConfig(this); 
        manager = KvManagerFactory.getInstance().createKvManager(config); 
    } 
    catch (KvStoreException exception) { 
        HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "some exception happen"); 
    } 
    return manager; 
}

创建成功后,借助KvManager创建SINGLE_VERSION分布式数据库,方法如下:

    SingleKvStore kvStore = null; 
    try { 
        Options options = new Options(); 
        options.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION); 
        kvStore = kvManager.getKvStore(options, STORE_ID); 
    } catch (KvStoreException exception) { 
        HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "some exception happen"); 
    } 
    return kvStore; 
}
  1. 如何进行数据查询、插入和删除

数据插入

在将数据写入分布式数据库之前,需要先构造分布式数据库的Key(键)和Value(值),通过putString方法将数据写入到数据库中,具体示例如下:

    if (key == null || key.isEmpty() || value == null || value.isEmpty()) { 
        return; 
    } 
    singleKvStore.putString(key, value); 
}

数据查询

分布式数据库中的数据查询是根据Key(键)来进行的,如果指定Key(键),则会查询出对应Key(键)的数据;如果不指定Key,既为空,则查询出所有数据,查询示例代码如下

    List entryList = singleKvStore.getEntries(""); 
    contactArray.clear(); 
    try { 
        for (Entry entry : entryList) { 
            contactArray.add(new Contacter(entry.getValue().getString(), entry.getKey())); 
        } 
    } catch (KvStoreException exception) { 
        HiLog.info(LABEL_LOG, LOG_FORMAT,TAG,"the value must be String"); 
    } 
    contactAdapter.notifyDataChanged(); 
}
  1. 如何进行分布式数据库的同步

在进行数据同步之前,首先需要先获取当前组网环境中的设备列表,然后指定同步方式(PULL_ONLY,PUSH_ONLY,PUSH_PULL)进行同步,以PUSH_PULL方式为例,示例代码如下:

    List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER); 
    List<String> deviceIdList = new ArrayList<>(); 
    for (DeviceInfo deviceInfo : deviceInfoList) { 
        deviceIdList.add(deviceInfo.getId()); 
    } 
    HiLog.info(LABEL_LOG, LOG_FORMAT,TAG, "device size= " + deviceIdList.size()); 
    if (deviceIdList.size() == 0) { 
        showTip("组网失败"); 
        return; 
    } 
    singleKvStore.registerSyncCallback(new SyncCallback() { 
        @Override 
        public void syncCompleted(Map<String, Integer> map) { 
            getUITaskDispatcher().asyncDispatch(new Runnable() { 
                @Override 
                public void run() { 
                    queryContact(); 
                    showTip("同步成功"); 
                } 
            }); 
            singleKvStore.unRegisterSyncCallback(); 
        } 
    }); 
    singleKvStore.sync(deviceIdList, SyncMode.PUSH_PULL); 
}
  1. 最终实现效果
  2. 示例代码
    代码结构解读

为了方便您的学习,我们提供了的分布式数据库示例工程的完整代码,工程以一个简易的信息管理系统为背景,代码的工程结构如下:
image.png

7 声望
1 粉丝
0 条评论
推荐阅读
网页游戏介绍
WebGame(网页游戏)[1]又称无端网游,中文也简称页游,是基于Web浏览器的网络在线多人互动游戏,无需下载客户端,打开网页只用浏览器就能玩的网络游戏。尤其适合上班一族,只要几分钟的设定,游戏内的自动成长功...

怪人叙谎言阅读 1k

[TIL] 如何使用 hex editor (二进制编辑器)修改游戏存档
在游戏没有进行特别混淆的的情况下这种方式能很轻松修改存档,对付一些没有现成修改器小众游戏很方便。当然如果能用 CE 之类的内存修改器也很好,但我是在 linux 中用 wine 跑的游戏,估计想用 CE 还要好一番折腾...

AlanZhang阅读 909

封面图
数据库/存储学习路径推荐
我自己就是从业务自学转入数据库内核研发岗位的,根据自己的经历,简单总结了一下入门数据库相关的学习路线、学习资料、项目书籍推荐等,大家可以参考。必看课程CMU-15445 和 CMU-15721[链接]这两个不用多说,经...

roseduan阅读 451

H5游戏架设经验分享
首先,我不是专业做游戏的,只是在一些机缘巧合下,发现可以自己架设游戏做GM,后台免费发送游戏中的各种充值和道具,然后在游戏里为所欲为,各种榜一秒杀,简直不要太爽,于是便一发不可收拾开始了游戏架设的研...

echeverra阅读 355

封面图
vue3 自定义渲染器 + canvas 写一个《贪吃蛇🐍》
前言由于 canvas 画图太麻烦,所有用 PixiJS 代替DEMO源码实现原理main.ts {代码...} App.vue {代码...} {代码...}

灬都是个谜阅读 322

封面图
英雄互娱 —— 提升 300% !一次性能优化实战记录
英雄互娱是国内知名游戏研发商和发行商,经常遇到热门线上游戏,在某瞬间出现大量登录请求,需要临时扩容资源的场景。为了让服务更好的应对突增并发请求压力,客户尝试通过把应用服务容器化部署,能通过 HPA(Hor...

观测云阅读 305

封面图
1 个案例读懂——游戏产品如何用 A/B 测试做增长
随着游戏出海以及私域流量运营的挑战,游戏企业对数据分析的使用需求和依赖度进一步提高。而在游戏研发立项、验证、开发、测试、上线和运营等阶段 A/B 测试均能发挥重要作用。

字节跳动数据平台阅读 74

封面图
7 声望
1 粉丝
宣传栏