# DistributedContacts **Repository Path**: ljh-project/DistributedContacts ## Basic Information - **Project Name**: DistributedContacts - **Description**: 本篇Codelab以通讯录为例,介绍分布式键值数据库的创建、数据的增加/删除/修改/查询/同步等操作方法。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2025-09-01 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于分布式键值数据库实现通讯录功能 ## 项目简介 本篇Codelab以通讯录为例,介绍分布式键值数据库的创建、数据的增加/删除/修改/查询/同步等操作方法。 ## 效果预览 | 新增 | 删除 | 编辑 | 查询 | |:-------------------------------------------------------------:|:-------------------------------------------------------------:|:--------------------------------------------------------------:|:---------------------------------------------------------------:| | | | | | ## 使用说明 1. 应用首页,点击右上角的“添加”按钮,进入新建联系人页面。 2. 应用首页,点击右上角的“更多”按钮,点击“批量删除”,进入联系人批量删除页面。 3. 应用首页,点击列表联系人,进入联系人详情页面。 4. 联系人详情页面,点击下方"编辑"按钮,进入联系人编辑页面。 5. 联系人详情页面,点击下方“删除”按钮,删除该联系人。 6. 新建联系人页面,输入联系人信息后,点击右上“保存”按钮,添加联系人,页面跳转到应用首页。 7. 联系人批量删除页面,点击下方全选,全部选中/不选中所有联系人。 8. 联系人批量删除页面,选中需要删除的联系人,下方点击“删除”按钮,删除选中的联系人。 9. 联系人编辑页面,编辑好联系人信息后,点击右上角的“保存”按钮,修改联系人信息。 ## 工程目录 ``` ├──entry/src/main/ets │ ├──common │ │ └──CommonConstants.ets // 常量集合 │ ├──components │ │ ├──ContactBottomBar.ets // 通讯录删除页面底部tab组件 │ │ ├──ContactDeleteDialog.ets // 通讯录删除弹窗组件 │ │ ├──ContactDetailItem.ets // 通讯录详情页列表项组件 │ │ ├──ContactDeviceDialog.ets // 通讯录设备弹窗组件 │ │ └──ContactListItem.ets // 通讯录列表页列表项组件 │ ├──entryability │ │ └──EntryAbility.ets // 入口文件 │ ├──pages │ │ ├──ContactAddAndEditPage.ets // 通讯录添加和编辑页面 │ │ ├──ContactDeletePage.ets // 通讯录删除页面 │ │ ├──ContactDetailPage.ets // 通讯录详情页面 │ │ └──ContactHomePage.ets // 通讯录首页 │ ├──utils │ │ ├──ContactDeviceManager.ets // 通讯录设备管理类 │ │ └──KvManager.ets // 键值型数据库管理类 │ └──viewmodel │ └──ContactViewModel.ets // 通讯录model └──entry/src/main/resources // 资源文件 ``` ## 具体实现 1. 封装设备管理类,调用设备管理能力[distributedDeviceManager.createDeviceManager()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#distributeddevicemanagercreatedevicemanager)创建一个设备管理实例,设备管理实例是分布式设备管理方法的调用入口,用于获取可信设备和本地设备的相关信息。 2. 通过设备管理实例DeviceManager的[on('deviceStateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#ondevicestatechange)事件注册设备状态回调,以便在设备状态发生变化时及时通知应用组网内可信设备的变化,并注册设备状态变化回调函数,根据返回的设备状态data.action执行不同方法更新设备列表。 3. 通过设备管理实例DeviceManager的[on('discoverSuccess')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#ondiscoversuccess)事件注册设备状态回调,以便在发现时及时通知应用组网内设备的变化,调用[startDiscovering()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#startdiscovering)发现周围设备。 4. 若设备在信任设备列表,执行[startAbility()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-uiabilitycontext#startability)方法启动连接设备上的应用,将当前的设备信息作为参数发送至连接设备。若设备不是信任设备,执行[bindTarget()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#bindtarget)方法启动验证。此时连接设备提示是否接受,接收连接后连接设备展示PIN码,本地设备输入PIN码确认后连接成功。再次点击查询设备按钮,选择已连接设备,点击确认启动连接设备上的应用。 5. 关闭设备弹窗时,调用[stopDiscovering()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#stopdiscovering)停止发现周边设备,并通过设备管理实例DeviceManager的[off('deviceStateChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#offdevicestatechange)和[off('discoverSuccess')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributeddevicemanager#offdiscoversuccess)事件注销设备监听任务。 6. 应用首次启动时,调用[requestPermissionsFromUser()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-abilityaccessctrl#requestpermissionsfromuser9)方法动态弹窗获取授权。 7. 创建键值型数据库对象实例,调用[distributedKVStore.createKVManager()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#distributedkvstorecreatekvmanager)创建一个KVManager对象实例,用于管理数据库对象,调用KVManager的[getKVStore()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#getkvstore)方法,创建并获取分布式键值数据库。 8. 调用[on('dataChange')](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#ondatachange)接口订阅组网内其他设备的数据变化,并注册数据变化回调函数。 9. 封装操作数据库的增([put()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#put))、删([delete()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#delete)、[deleteBatch()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#deletebatch))、改([put()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#put))、查([get()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#get)、[getEntries()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#getentries))六个方法。 10. 调用同步数据的接口[sync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-distributedkvstore#sync)推送当前设备数据变化至组网内其他设备。 11. 当组网内其他设备数据发生变化时,执行回调函数,通过自定义getAllData()方法获取发生数据变化设备的全部数据,更新本地数据。 ## 相关权限 本篇Codelab用到分布式的能力,需要在配置文件module.json5里添加不同设备间的数据交换权限:ohos.permission.DISTRIBUTED_DATASYNC。 ## 约束与限制 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 2. HarmonyOS系统:HarmonyOS 5.1.1 Release及以上。 3. DevEco Studio版本:DevEco Studio 5.1.1 Release及以上。 4. HarmonyOS SDK版本:HarmonyOS 5.1.1 Release SDK及以上。 5. 双端设备需要登录同一华为账号,建议打开查找设备功能。 6. 双端设备需要打开Wi-Fi和蓝牙开关,条件允许时,建议连接同一局域网。 7. 双端设备都需要有该应用。