分布式数据生成
- 如何使用分布式数据库
介绍
分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组,分布式数据服务对属于不同的应用的数据进行隔离,保证不同应用之间的数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上一致的数据访问体验。
有关分布式数据服务更加详细的介绍可以参考分布式数据服务游戏。
本教程将为您完整介绍以下内容并展示完整示例:
分布式数据库的创建
分布式数据库的插入和删除
分布式数据库的数据同步
- 实现分布式数据库需要申请的权限
为了实现分布式数据库,需要在entry\src\main\config.json中申请ohos.permission.DISTRIBUTED_DATASYNC权限,以便允许不同设备间的数据交换。示例代码如下:
"reqPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC"
}
]
}
- 如何创建分布式数据库
要创建分布式数据库,首先要做的就是创建分布式数据库管理器实例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;
}
- 如何进行数据查询、插入和删除
数据插入
在将数据写入分布式数据库之前,需要先构造分布式数据库的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();
}
- 如何进行分布式数据库的同步
在进行数据同步之前,首先需要先获取当前组网环境中的设备列表,然后指定同步方式(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);
}
- 最终实现效果
- 示例代码
代码结构解读
为了方便您的学习,我们提供了的分布式数据库示例工程的完整代码,工程以一个简易的信息管理系统为背景,代码的工程结构如下: