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权限,以便允许不同设备间的数据交换。
示例代码如下:
- module": {
- ......
- "reqPermissions": [
- {
- "name": "ohos.permission.DISTRIBUTED_DATASYNC"
- }
- ]
- }
复制代码
4. 如何创建分布式数据库 要创建分布式数据库,首先要做的就是创建分布式数据库管理器实例KvManager,我们定义了如下方法:
- private KvManager createManager() {
- 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分布式数据库,方法如下:
- private SingleKvStore createDb(KvManager kvManager) {
- 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;
- }
复制代码
说明
SINGLE_VERSION分布式数据库是指数据在本地保存是以单个KV条目为单位的方式保存,对每个Key最多只保存一个条目项,当数据在本地被用户修改时,不管它是否已经被同步出去,均直接在这个条目上进行修改。
最后是订阅分布式数据库中数据变化,方法如下:
- private void subscribeDb(SingleKvStore singleKvStore) {
- KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();
- singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_REMOTE, kvStoreObserverClient);
- }
复制代码
说明
分布式数据库支持订阅远端和本地的数据变化,示例代码中订阅的方式为订阅远端,订阅本地的参数为SUBSCRIBE_TYPE_LOCAL;同时还支持订阅全部,参数为SUBSCRIBE_TYPE_ALL。
5. 如何进行数据查询、插入和删除
数据插入在将数据写入分布式数据库之前,需要先构造分布式数据库的Key(键)和Value(值),通过putString方法将数据写入到数据库中,具体示例如下:
- private void writeData(String key, String value) {
- if (key == null || key.isEmpty() || value == null || value.isEmpty()) {
- return;
- }
- singleKvStore.putString(key, value);
- }
复制代码
数据查询分布式数据库中的数据查询是根据Key(键)来进行的,如果指定Key(键),则会查询出对应Key(键)的数据;如果不指定Key,既为空,则查询出所有数据,查询示例代码如下
- private void queryContact() {
- 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();
- }
复制代码
说明
以上代码除查询外,还有部分场景业务代码。
数据删除对于分布式数据库的删除操作,可以直接调用deleteKvStore()方法,但是需要传递事先定义好的STORE_ID参数(具体定义参考下文完整代码),示例代码如下:
- [url=home.php?mod=space&uid=2735960]@Override[/url]
- protected void onStop() {
- super.onStop();
- kvManager.closeKvStore(singleKvStore);
- kvManager.deleteKvStore(STORE_ID);
- }
复制代码
6. 如何进行分布式数据库的同步 在进行数据同步之前,首先需要先获取当前组网环境中的设备列表,然后指定同步方式(PULL_ONLY,PUSH_ONLY,PUSH_PULL)进行同步,以PUSH_PULL方式为例,示例代码如下:
- private void syncContact() {
- 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);
- }
复制代码
说明
以上代码除数据同步外,还有部分场景业务代码。
7. 最终实现效果
新建信息:
数据库同步过程:
A手机 | B手机 |
| |
完整代码参考请参示例代码。
8. 恭喜你 通过本教程的学习,你已经学会了分布式数据库服务的基础操作(创建、新增、删除、同步)。