From c0532030333e9599a356e4634cbed2bd28edc9d5 Mon Sep 17 00:00:00 2001 From: qian-nan-xu Date: Sat, 2 Apr 2022 16:51:02 +0800 Subject: [PATCH] issue modifies Signed-off-by: qian-nan-xu --- README.en.md | 43 -- README.md | 523 +----------------- README_zh.md | 520 +++++++++++++++++ ability/common/utils/src/file_utils.cpp | 2 +- contacts/src/contacts_api.cpp | 12 +- dataBusiness/contacts/src/contacts.cpp | 2 +- dataBusiness/contacts/src/raw_contacts.cpp | 8 +- .../quicksearch/src/contacts_search.cpp | 2 +- figures/Image_architecture_zh.png | Bin 0 -> 52400 bytes 9 files changed, 557 insertions(+), 555 deletions(-) delete mode 100644 README.en.md create mode 100644 README_zh.md create mode 100644 figures/Image_architecture_zh.png diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 9d613e5..0000000 --- a/README.en.md +++ /dev/null @@ -1,43 +0,0 @@ -# applications_contactsdata - -- [Introduction](#section1166054159366) -- [Image architecture](#section1619419895966) -- [Directory Structure](#section161941989596) -- [Repositories Involved](#section1371113476307) - -## Introduction - -The contact database application is an indispensable management information application for every user to manage the contact database. -Its content is very important for user managers, so the contact database should be able to provide sufficient information and quick -query means for each user's management, which greatly facilitates users to reasonably manage the contact database information. - -## Image architecture - -![](figures/Image_architecture.png) - -## Directory Structure - -``` -/foundation/contactsdataability/ -├── ability -│   ├── account #Account Management -│   ├── common #Public Method -│   ├── datadisasterrecovery #Data Corruption Recovery -│   ├── merge #Contacts Merge -│   └── sinicization #Chinese Characters to Pinyin Related -├── contacts #NAPI -├── dataBusiness -│   ├── calllog #Call Records -│   ├── contacts #Contacts Person -│   ├── quicksearch #Quick Search -│   └── voicemail #Voicemail -├── test #Test Catalog -├── BUILD.gn -└── ohos.build -``` - -## Repositories Involved - -system applications - -applications_contactsdata \ No newline at end of file diff --git a/README.md b/README.md index 582db97..2d4ce34 100644 --- a/README.md +++ b/README.md @@ -1,520 +1,43 @@ -# 联系人数据库子系统 -# applications_contactsdata +# applications_contactsdata -- [简介](#section1166054159366) -- [架构图](#section1619419895966) -- [目录](#section161941989596) -- [相关仓](#section1371113476307) +- [Introduction](#section1166054159366) +- [Image architecture](#section1619419895966) +- [Directory Structure](#section161941989596) +- [Repositories Involved](#section1371113476307) -## 简介 +## Introduction -联系人数据库应用是每一个用户管理联系人数据库的不可缺少的一个管理信息应用, -它的内容对于用户管理者来说是至关重要的,所以联系人数据库应该能够为每一个 -用户的管理提供充足的信息和快捷查询手段,大大方便用户合理的管理联系人数据库信息。 +The contact database application is an indispensable information management applicationS for every user to manage the contact database. +Its content is very important for user managers, so the contact database should be able to provide sufficient information and quick +query means for each user's management, which greatly helps users to reasonably manage the contact database information. -## 架构图 +## Image architecture ![](figures/Image_architecture.png) -## 目录 +## Directory Structure ``` /foundation/contactsdataability/ ├── ability -│   ├── account #账户管理 -│   ├── common #公共方法:log,utils等 -│   ├── datadisasterrecovery #数据损坏恢复 -│   ├── merge #联系人合并 -│   └── sinicization #汉字转拼音相关 +│   ├── account #Account Management +│   ├── common #Public Methods +│   ├── datadisasterrecovery #Data Corruption Recovery +│   ├── merge #Contacts Merge +│   └── sinicization #Chinese Characters to Pinyin Related ├── contacts #NAPI ├── dataBusiness -│   ├── calllog #通话记录 -│   ├── contacts #联系人 -│   ├── quicksearch #快速检索 -│   └── voicemail #语音信箱 -├── test #测试目录 +│   ├── calllog #Call Records +│   ├── contacts #Contacts Person +│   ├── quicksearch #Quick Search +│   └── voicemail #Voicemail +├── test #Test Catalog ├── BUILD.gn └── ohos.build ``` -## 使用说明 -### 概述 +## Repositories Involved -提供联系人数据和通话记录以及语音信箱增、删、改、查、等接口。 -接口参数主要有string类型的uri和对象类型的value、DataAbilityPredicates - -使用功能接口前,需要导入相关模块。 - -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -``` -### 通话记录 - -#### DAHelper.insert(uri: string, value: ValuesBucket) - -- 接口说明 - - 通话记录插入 - -- insert参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - -返回值为 通话记录id - -更新示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; -var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; -var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); -// 调用insert方法 -DAHelper.insert(calllogUri, value).then((data) => { - console.info("calllogId = " + data); -}); -``` -#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) - -- 接口说明 - - 通话记录修改 - -- update参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | - -返回值为 成功为0否则为-1 - -修改示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; -var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; -var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用update方法 -DAHelper.update(calllogUri, value, condition).then((data) => { - console.info("resultCode = " + data); -}); -``` - -#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) - -- 接口说明 - - 通话记录删除 - -- delete参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | - -返回值为 成功为0否则为-1 - -删除示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; -var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用delete方法 -DAHelper.delete(calllogUri, condition).then((data) => { - console.info("deleteCode = " + data); -}); -``` - -#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) - -- 接口说明 - - 通话记录查询 - -- 查询参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | - | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | - -返回值为 ResultSet 查询结果集 - -查询示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; -var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -var resultColumns = [ "id", "display_name", "phone_number"]; -// 调用query方法 -DAHelper.query(calllogUri, resultColumns, condition).then((data) => { - if (resultSet.goToFirstRow()) { - do { - var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); - var id = resultSet.getInt(resultSet.getColumnIndex("id")); - var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); - } while (resultSet.goToNextRow()); - } - resultSet.close(); -}); -``` -返回值为 ResultSet 查询结果集 - -### 语音信箱 - -#### DAHelper.insert(uri: string, value: ValuesBucket) - -- 接口说明 - - 语音信箱插入 - -- insert参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - -返回值为 语音信箱表id - -更新示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; -var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; -var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); -// 调用insert方法 -DAHelper.insert(voicemaiUri, value).then((data) => { - console.info("calllogId = " + data); -}); -``` -#### DAHelper.update(uri: string, value: ValuesBucket, condition:DataAbilityPredicates) - -- 接口说明 - - 语音信箱修改 - -- update参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | - -返回值为 成功为0否则为-1 - -修改示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; -var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; -var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用update方法 -DAHelper.update(voicemaiUri, value, condition).then((data) => { - console.info("resultCode = " + data); -}); -``` - -#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) - -- 接口说明 - - 语音信箱删除 - -- delete参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | - -返回值为 成功为0否则为-1 - -删除示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; -var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用delete方法 -DAHelper.delete(voicemaiUri, condition).then((data) => { - console.info("deleteCode = " + data); -}); -``` - -#### DAHelper.query(uri: string, resultColumns:array, condition: DataAbilityPredicates) - -- 接口说明 - - 语音信箱查询 - -- 查询参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | - | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | - -返回值为 ResultSet 查询结果集 - -查询示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; -var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -var resultColumns = [ "id", "display_name", "phone_number"]; -// 调用query方法 -DAHelper.query(voicemaiUri, resultColumns, condition).then((data) => { - if (resultSet.goToFirstRow()) { - do { - var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); - var id = resultSet.getInt(resultSet.getColumnIndex("id")); - var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); - } while (resultSet.goToNextRow()); - } - resultSet.close(); -}); -``` - -### 联系人 - -#### DAHelper.insert(uri: string, value: ValuesBucket) - -- 接口说明 - - 联系人插入 - -- insert参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - -返回值为 联系人数据表id - -更新示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var contactsUri= "dataability:///com.ohos.contactsdataability"; -var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; -var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; -var value = {"display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); -// 调用insert方法 -DAHelper.insert(rawContactUri, value).then((rawContactId) => { - console.info("rawContactId = " + rawContactId); - // 联系人详细信息插入 - var contactDataValues = { - "raw_contact_id" : rawContactId, - "content_type" : "name", - "detail_info" : "xxxxxxx" - }; - DAHelper.insert(contactDataUri, contactDataValues).then((contactDataId) => { - console.info("rawContactId = " + contactDataId); - }; -}); -``` -#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) - -- 接口说明 - - 联系人修改 - -- update参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | - | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | - -返回值为 成功为0否则为-1 - -修改示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var contactsUri= "dataability:///com.ohos.contactsdataability"; -var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; -var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; -var value = {"display_name" : "xxx"}; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用update方法 -DAHelper.update(rawContactUri, value, condition).then((data) => { - console.info("resultCode = " + data); -}); -``` - -#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) - -- 接口说明 - - 联系人删除 - -- delete参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | - -返回值为 成功为0否则为-1 - -删除示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var contactsUri= "dataability:///com.ohos.contactsdataability"; -var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; -var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -// 调用delete方法 -DAHelper.delete(contactDataUri, condition).then((data) => { - console.info("deleteCode = " + data); -}); -``` -#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) - -- 接口说明 - - 联系人查询 - -- 查询参数描述 - - | 名称 | 读写属性 | 类型 | 必填 | 描述 | - | -------- | -------- | ---------------------- | ---- | ------------------------------ | - | uri | 只读 | string | 是 | 具体操作的uri | - | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | - | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | - -返回值为 ResultSet 查询结果集 - -查询示例 -```js -import featureAbility from '@ohos.ability.featureAbility'; -import ohos_data_ability from '@ohos.data.dataability'; -var contactsUri= "dataability:///com.ohos.contactsdataability"; -var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; -// 获取DAHelper -let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); -// 条件参数 -var condition = new ohos_data_ability.DataAbilityPredicates(); -condition.equalTo("id", "xxx"); -var resultColumns = [ "id", "display_name"]; -// 调用query方法 -DAHelper.query(rawContactUri, resultColumns, condition).then((data) => { - if (resultSet.goToFirstRow()) { - do { - var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); - } while (resultSet.goToNextRow()); - } - resultSet.close(); -}); -``` -| 系统公共uri | -| --------------------------------------------------------- | -| dataability:///com.ohos.contactsdataability | -| dataability:///com.ohos.contactsdataability/contacts/contact | -| dataability:///com.ohos.contactsdataability/contacts/raw_contact | -| dataability:///com.ohos.contactsdataability/contacts/contact_data | -| dataability:///com.ohos.contactsdataability/contacts/raw_contact/query_merge_list| -| dataability:///com.ohos.contactsdataability/contacts/raw_contact/split_contact | -| dataability:///com.ohos.contactsdataability/contacts/raw_contact/manual_merge | -| dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_merge | -| dataability:///com.ohos.contactsdataability/contacts/contact_type | -| dataability:///com.ohos.contactsdataability/contacts/groups | -| dataability:///com.ohos.contactsdataability/contacts/photo_files | -| dataability:///com.ohos.contactsdataability/contacts/contact_blocklist | -| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | -| dataability:///com.ohos.contactsdataability/contacts/search_contact | -| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | -| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact_record | -| dataability:///com.ohos.contactsdataability/contacts/backup | -| dataability:///com.ohos.contactsdataability/contacts/recover | -| dataability:///com.ohos.contactsdataability/profile/contact | -| dataability:///com.ohos.contactsdataability/profile/raw_contact | -| dataability:///com.ohos.contactsdataability/profile/contact_data | -| dataability:///com.ohos.contactsdataability/profile/raw_contact/query_merge_list | -| dataability:///com.ohos.contactsdataability/profile/raw_contact/split_contact | -| dataability:///com.ohos.contactsdataability/profile/raw_contact/manual_merge | -| dataability:///com.ohos.contactsdataability/profile/raw_contact/auto_merge | -| dataability:///com.ohos.contactsdataability/profile/contact_type | -| dataability:///com.ohos.contactsdataability/profile/groups | -| dataability:///com.ohos.contactsdataability/profile/photo_files | -| dataability:///com.ohos.contactsdataability/profile/contact_blocklist | -| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | -| dataability:///com.ohos.contactsdataability/profile/search_contact | -| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | -| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact_record | -| dataability:///com.ohos.contactsdataability/profile/backup | -| dataability:///com.ohos.contactsdataability/profile/recover | -| dataability:///com.ohos.calllogability | -| dataability:///com.ohos.calllogability/calls/calllog | -| dataability:///com.ohos.voicemailability | -| dataability:///com.ohos.voicemailability/calls/voicemail | -## 相关仓 - -系统应用 +system applications applications_contactsdata \ No newline at end of file diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..fa3bf20 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,520 @@ +# 联系人数据库子系统 +# applications_contactsdata + +- [简介](#section1166054159366) +- [架构图](#section1619419895966) +- [目录](#section161941989596) +- [相关仓](#section1371113476307) + +## 简介 + +联系人数据库应用是每一个用户管理联系人数据库的不可缺少的一个信息管理应用, +它的内容对于用户管理者来说是至关重要的,所以联系人数据库应该能够为每一个 +用户的管理提供充足的信息和快捷查询手段,大大方便用户合理的管理联系人数据库信息。 + +## 架构图 + +![](figures/Image_architecture_zh.png) + +## 目录 + +``` +/foundation/contactsdataability/ +├── ability +│   ├── account #账户管理 +│   ├── common #公共方法:log,utils等 +│   ├── datadisasterrecovery #数据损坏恢复 +│   ├── merge #联系人合并 +│   └── sinicization #汉字转拼音相关 +├── contacts #NAPI +├── dataBusiness +│   ├── calllog #通话记录 +│   ├── contacts #联系人 +│   ├── quicksearch #快速检索 +│   └── voicemail #语音信箱 +├── test #测试目录 +├── BUILD.gn +└── ohos.build +``` +## 使用说明 + +### 概述 + +提供联系人数据和通话记录以及语音信箱增、删、改、查、等接口。 +接口参数主要有string类型的uri和对象类型的value、DataAbilityPredicates + +使用功能接口前,需要导入相关模块。 + +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +``` +### 通话记录 + +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 通话记录插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 通话记录id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 调用insert方法 +DAHelper.insert(calllogUri, value).then((data) => { + console.info("calllogId = " + data); +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(calllogUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(calllogUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` + +#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) + +- 接口说明 + + 通话记录查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var calllogDAhelperUri= "dataability:///com.ohos.calllogability"; +var calllogUri = "dataability:///com.ohos.calllogability/calls/calllog"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name", "phone_number"]; +// 调用query方法 +DAHelper.query(calllogUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + var id = resultSet.getInt(resultSet.getColumnIndex("id")); + var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` +返回值为 ResultSet 查询结果集 + +### 语音信箱 + +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 语音信箱插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 语音信箱表id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 调用insert方法 +DAHelper.insert(voicemaiUri, value).then((data) => { + console.info("calllogId = " + data); +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition:DataAbilityPredicates) + +- 接口说明 + + 语音信箱修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +var value = {"phone_number" : "xxxxx","display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(voicemaiUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 语音信箱删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(voicemailDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(voicemaiUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` + +#### DAHelper.query(uri: string, resultColumns:array, condition: DataAbilityPredicates) + +- 接口说明 + + 语音信箱查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var voicemailDAhelperUri= "dataability:///com.ohos.voicemailability"; +var voicemaiUri = "dataability:///com.ohos.voicemailability/calls/voicemail"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(calllogDAhelperUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name", "phone_number"]; +// 调用query方法 +DAHelper.query(voicemaiUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + var id = resultSet.getInt(resultSet.getColumnIndex("id")); + var phoneNumber = resultSet.getString(resultSet.getColumnIndex("phone_number")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` + +### 联系人 + +#### DAHelper.insert(uri: string, value: ValuesBucket) + +- 接口说明 + + 联系人插入 + +- insert参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + +返回值为 联系人数据表id + +更新示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +var value = {"display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 调用insert方法 +DAHelper.insert(rawContactUri, value).then((rawContactId) => { + console.info("rawContactId = " + rawContactId); + // 联系人详细信息插入 + var contactDataValues = { + "raw_contact_id" : rawContactId, + "content_type" : "name", + "detail_info" : "xxxxxxx" + }; + DAHelper.insert(contactDataUri, contactDataValues).then((contactDataId) => { + console.info("rawContactId = " + contactDataId); + }; +}); +``` +#### DAHelper.update(uri: string, value: ValuesBucket, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人修改 + +- update参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | value | 只读 | ValuesBucket | 是 | 数据库字段key-value对象 | + | condition | 只读 | DataAbilityPredicates | 是 | 更新条件 | + +返回值为 成功为0否则为-1 + +修改示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +var value = {"display_name" : "xxx"}; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用update方法 +DAHelper.update(rawContactUri, value, condition).then((data) => { + console.info("resultCode = " + data); +}); +``` + +#### DAHelper.delete(uri: string, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人删除 + +- delete参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | condition | 只读 | DataAbilityPredicates | 是 | 删除条件 | + +返回值为 成功为0否则为-1 + +删除示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +var contactDataUri = "dataability:///com.ohos.contactsdataability/contacts/contact_data"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +// 调用delete方法 +DAHelper.delete(contactDataUri, condition).then((data) => { + console.info("deleteCode = " + data); +}); +``` +#### DAHelper.query(uri: string, resultColumns: array, condition: DataAbilityPredicates) + +- 接口说明 + + 联系人查询 + +- 查询参数描述 + + | 名称 | 读写属性 | 类型 | 必填 | 描述 | + | -------- | -------- | ---------------------- | ---- | ------------------------------ | + | uri | 只读 | string | 是 | 具体操作的uri | + | resultColumns | 只读 | array | 是 | 需要查询的列字段名称 | + | condition | 只读 | DataAbilityPredicates | 是 | 查询条件 | + +返回值为 ResultSet 查询结果集 + +查询示例 +```js +import featureAbility from '@ohos.ability.featureAbility'; +import ohos_data_ability from '@ohos.data.dataability'; +var contactsUri= "dataability:///com.ohos.contactsdataability"; +var rawContactUri = "dataability:///com.ohos.contactsdataability/contacts/raw_contact"; +// 获取DAHelper +let DAHelper = featureAbility.acquireDataAbilityHelper(contactsUri); +// 条件参数 +var condition = new ohos_data_ability.DataAbilityPredicates(); +condition.equalTo("id", "xxx"); +var resultColumns = [ "id", "display_name"]; +// 调用query方法 +DAHelper.query(rawContactUri, resultColumns, condition).then((data) => { + if (resultSet.goToFirstRow()) { + do { + var displayName = resultSet.getString(resultSet.getColumnIndex("display_name")); + } while (resultSet.goToNextRow()); + } + resultSet.close(); +}); +``` +| 系统公共uri | +| --------------------------------------------------------- | +| dataability:///com.ohos.contactsdataability | +| dataability:///com.ohos.contactsdataability/contacts/contact | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/contact_data | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/query_merge_list| +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/split_contact | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/manual_merge | +| dataability:///com.ohos.contactsdataability/contacts/raw_contact/auto_merge | +| dataability:///com.ohos.contactsdataability/contacts/contact_type | +| dataability:///com.ohos.contactsdataability/contacts/groups | +| dataability:///com.ohos.contactsdataability/contacts/photo_files | +| dataability:///com.ohos.contactsdataability/contacts/contact_blocklist | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/search_contact | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/contacts/deleted_raw_contact_record | +| dataability:///com.ohos.contactsdataability/contacts/backup | +| dataability:///com.ohos.contactsdataability/contacts/recover | +| dataability:///com.ohos.contactsdataability/profile/contact | +| dataability:///com.ohos.contactsdataability/profile/raw_contact | +| dataability:///com.ohos.contactsdataability/profile/contact_data | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/query_merge_list | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/split_contact | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/manual_merge | +| dataability:///com.ohos.contactsdataability/profile/raw_contact/auto_merge | +| dataability:///com.ohos.contactsdataability/profile/contact_type | +| dataability:///com.ohos.contactsdataability/profile/groups | +| dataability:///com.ohos.contactsdataability/profile/photo_files | +| dataability:///com.ohos.contactsdataability/profile/contact_blocklist | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/profile/search_contact | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact | +| dataability:///com.ohos.contactsdataability/profile/deleted_raw_contact_record | +| dataability:///com.ohos.contactsdataability/profile/backup | +| dataability:///com.ohos.contactsdataability/profile/recover | +| dataability:///com.ohos.calllogability | +| dataability:///com.ohos.calllogability/calls/calllog | +| dataability:///com.ohos.voicemailability | +| dataability:///com.ohos.voicemailability/calls/voicemail | +## 相关仓 + +系统应用 + +applications_contactsdata \ No newline at end of file diff --git a/ability/common/utils/src/file_utils.cpp b/ability/common/utils/src/file_utils.cpp index c060738..555fa25 100644 --- a/ability/common/utils/src/file_utils.cpp +++ b/ability/common/utils/src/file_utils.cpp @@ -31,7 +31,7 @@ FileUtils::~FileUtils() int FileUtils::IsFolderExist(std::string path) { DIR *dp; - if ((dp = opendir(path.c_str())) == NULL) { + if ((dp = opendir(path.c_str())) == nullptr) { HILOG_ERROR("FileUtils file NULL"); return OPERATION_ERROR; } diff --git a/contacts/src/contacts_api.cpp b/contacts/src/contacts_api.cpp index 86362c4..04fe045 100644 --- a/contacts/src/contacts_api.cpp +++ b/contacts/src/contacts_api.cpp @@ -171,7 +171,7 @@ std::shared_ptr GetDataAbilityHelper(napi_e HILOG_ERROR("abilityObj is nullptr!"); } OHOS::AppExecFwk::Ability *ability = nullptr; - NAPI_CALL(env, napi_get_value_external(env, abilityObj, (void **)&ability)); + NAPI_CALL(env, napi_get_value_external(env, abilityObj, reinterpret_cast&&ability); if (ability == nullptr) { HILOG_ERROR("ability is nullptr!"); } @@ -586,7 +586,7 @@ NativeRdb::DataAbilityPredicates BuildIsMyCardPredicates(napi_env env, napi_valu void ExecuteDone(napi_env env, napi_status status, void *data) { - ExecuteHelper *executeHelper = (ExecuteHelper *)data; + ExecuteHelper *executeHelper = reinterpret_castdata; napi_value result = executeHelper->dataValue; executeHelper->dataValue = nullptr; napi_deferred deferred = executeHelper->deferred; @@ -604,7 +604,7 @@ void ExecuteSyncDone(napi_env env, napi_status status, void *data) return; } if (data != nullptr) { - ExecuteHelper *executeHelper = (ExecuteHelper *)data; + ExecuteHelper *executeHelper = reinterpret_castdata; napi_value global; napi_get_global(env, &global); napi_value resultData[1]; @@ -833,13 +833,15 @@ napi_value CreateAsyncWork(napi_env env, ExecuteHelper *executeHelper, napi_call napi_create_reference(env, argv[argc - 1], 1, &executeHelper->callBack); } napi_create_async_work( - env, nullptr, workName, Execute, ExecuteSyncDone, (void *)executeHelper, &(executeHelper->work)); + env, nullptr, workName, Execute, ExecuteSyncDone, reinterpret_castexecuteHelper, + &(executeHelper->work)); napi_get_null(env, &result); } else { napi_create_string_latin1(env, __func__, NAPI_AUTO_LENGTH, &workName); napi_create_promise(env, &(executeHelper->deferred), &result); napi_create_async_work( - env, nullptr, workName, Execute, ExecuteDone, (void *)executeHelper, &(executeHelper->work)); + env, nullptr, workName, Execute, ExecuteDone, reinterpret_castexecuteHelper, + &(executeHelper->work)); } napi_queue_async_work(env, executeHelper->work); executeHelper->promise = result; diff --git a/dataBusiness/contacts/src/contacts.cpp b/dataBusiness/contacts/src/contacts.cpp index 11d0fad..519f47f 100644 --- a/dataBusiness/contacts/src/contacts.cpp +++ b/dataBusiness/contacts/src/contacts.cpp @@ -123,7 +123,7 @@ int Contacts::DeleteContactById(std::shared_ptr rdbSt { std::shared_ptr &store = rdbStore; if (store == nullptr) { - HILOG_ERROR("ContactsAccount DeletecontactById store is nullptr"); + HILOG_ERROR("ContactsAccount DeletecontactById store is nullptr"); return RDB_OBJECT_EMPTY; } if (needDeleteContactId < ID_EMPTY) { diff --git a/dataBusiness/contacts/src/raw_contacts.cpp b/dataBusiness/contacts/src/raw_contacts.cpp index d6717d5..c2cf345 100644 --- a/dataBusiness/contacts/src/raw_contacts.cpp +++ b/dataBusiness/contacts/src/raw_contacts.cpp @@ -30,10 +30,10 @@ RawContacts::~RawContacts() } /** - * @brief RawContacts insert table raw_contact + * @brief Insert data to the raw_contact table * * @param rdbStore Insert operation based on rdbStore - * @param rawContactValues Pass in parameter rawContactValues + * @param rawContactValues Raw contact values to be inserted * * @return Insert database results code */ @@ -48,11 +48,11 @@ int RawContacts::InsertRawContact(std::shared_ptr rdb } /** - * @brief RawContacts update table raw_contact + * @brief Update data in the raw_contact table * * @param rdbStore Update operation based on rdbStore * @param upRawContactValues Pass in parameter upRawContactValues - * @param whereClause Conditions for update operation + * @param whereClause Clauses for update operation * @param whereArgs Conditions for update operation * * @return Update database results code diff --git a/dataBusiness/quicksearch/src/contacts_search.cpp b/dataBusiness/quicksearch/src/contacts_search.cpp index bc58463..8bdf710 100644 --- a/dataBusiness/quicksearch/src/contacts_search.cpp +++ b/dataBusiness/quicksearch/src/contacts_search.cpp @@ -47,7 +47,7 @@ int64_t ContactsSearch::Insert(std::shared_ptr rdbSto } /** - * @brief ContactsDataBase update by quick_search_key + * @brief Update contact data by quick_search_key * * @param rawContactId Parameters to be passed for update operation * @param type Parameters to be passed for update operation diff --git a/figures/Image_architecture_zh.png b/figures/Image_architecture_zh.png new file mode 100644 index 0000000000000000000000000000000000000000..7e34ac72c1d1670ca290502832d1f1ba346f4f2f GIT binary patch literal 52400 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 literal 0 HcmV?d00001