标准化数据类型 (C/C++)
===============

#### 场景介绍

统一数据管理框架（UDMF）提供数据跨应用、跨设备交互标准，定义数据交互过程中的数据语言，提升数据交互效率。它提供安全、标准化的数据流通路径，支持不同级别的数据访问权限和生命周期管理策略，实现高效的数据共享。

#### 基本概念

*   **标准化数据类型**：Uniform Type Descriptor，简称UTD。主要针对同一种数据类型，提供统一定义，即标准数据类型描述符，定义了包括标识数据类型的ID、类型归属关系等相关信息，用于解决HarmonyOS系统中的类型模糊问题。一般用于过滤或者识别某一种数据类型的场景，比如文件预览、文件分享等。

#### 接口说明

详细的接口说明请参考[UTD接口文档](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-utd-h)。

| 接口名称 | 描述 |
| :-- | :-- |
| OH\_Utd\* OH\_Utd\_Create(const char\* typeId) | 创建一个指向统一数据类型描述符OH\_Utd的指针。 |
| void OH\_Utd\_Destroy(OH\_Utd\* pThis) | 销毁指向统一数据类型描述符OH\_Utd的指针。 |
| const char\*\* OH\_Utd\_GetTypesByFilenameExtension(const char\* extension, unsigned int\* count) | 通过文件后缀名获取标准化数据类型ID。 |
| const char\*\* OH\_Utd\_GetTypesByMimeType(const char\* mimeType, unsigned int\* count) | 通过MIME类型获取标准化数据类型ID。 |
| bool OH\_Utd\_Equals(OH\_Utd\* utd1, OH\_Utd\* utd2) | 判断两种标准化数据类型是否相等。 |
| void OH\_Utd\_DestroyStringList(const char\*\* list, unsigned int count) | 销毁字符串列表数据。 |
| bool OH\_Utd\_BelongsTo (const char \*srcTypeId, const char \*destTypeId) | 判断两个标准化数据描述类型是否存在归属关系。 |
| bool OH\_Utd\_IsLower (const char\* srcTypeId, const char\* destTypeId ) | 判断原标准化数据类型是否是目标标准化数据类型的低层级类型。 例如TYPE\_SCRIPT为SOURCE\_CODE的低层级类型，TYPE\_SCRIPT和SOURCE\_CODE为PLAIN\_TEXT的低层级类型。 |
| bool OH\_Utd\_IsHigher (const char\* srcTypeId, const char\* destTypeId ) | 判断原标准化数据类型是否是目标标准化数据类型的高层级类型。 例如SOURCE\_CODE为TYPE\_SCRIPT的高层级类型，PLAIN\_TEXT为SOURCE\_CODE和TYPE\_SCRIPT的高层级类型。 |

#### 添加动态链接库

CMakeLists.txt中添加以下库。

libudmf.so, libhilog\_ndk.z.so

#### 引用头文件

#include <cstdio>
#include <cstring>
#include <database/udmf/utd.h>
#include <database/udmf/uds.h>
#include <database/udmf/udmf.h>
#include <database/udmf/udmf\_meta.h>
#include <database/udmf/udmf\_err\_code.h>
#include <hilog/log.h>

#undef LOG\_TAG
#define LOG\_TAG "MY\_LOG"

#### 通过不同方式获取不同类型数据并且比较它们之间的关系

下面以获取纯文本数据的查询场景为例，说明如何使用UTD。

1.  通过后缀名“.txt”获取UTD的typeId。
2.  通过MIME类型“text/plain”获取UTD的typeId。
3.  使用以上两个步骤获取到的typeId创建UTD实例对象。
4.  比较UTD实例对象是否相等。
5.  比较两种方式获取到的typeId是否存在归属关系。
6.  比较两种方式获取到的typeIds1\[0\]是否是typeIds2\[0\]的低层级类型。
7.  比较两种方式获取到的typeIds1\[0\]是否是typeIds2\[0\]的高层级类型。
8.  使用结束后，删除上述步骤中产生的指针。

// 1. 通过文件后缀名获取纯文本类型的UTD的typeId
unsigned int typeIds1Count = 0;
const char \*\*typeIds1 = OH\_Utd\_GetTypesByFilenameExtension(".txt", &typeIds1Count);
OH\_LOG\_INFO(LOG\_APP, "the count of typeIds1 is %{public}u", typeIds1Count);
// 2. 通过MIME类型获取typeId
unsigned int typeIds2Count = 0;
const char \*\*typeIds2 = OH\_Utd\_GetTypesByMimeType("text/plain", &typeIds2Count);
OH\_LOG\_INFO(LOG\_APP, "the count of typeIds2 is %{public}u", typeIds2Count);
// 3. 使用以上两个步骤获取到的typeId创建UTD实例对象。
OH\_Utd \*utd1 = OH\_Utd\_Create(typeIds1\[0\]);
OH\_Utd \*utd2 = OH\_Utd\_Create(typeIds2\[0\]);
// 4. 比较两种方式获取到的typeId对应的UTD是否相同
bool isEquals = OH\_Utd\_Equals(utd1, utd2);
if (isEquals) {
    OH\_LOG\_INFO(LOG\_APP, "utd1 == utd2");
} else {
    OH\_LOG\_INFO(LOG\_APP, "utd1 != utd2");
}
// 5. 比较两种方式获取到的typeId是否存在归属关系
bool isBelongsTo = OH\_Utd\_BelongsTo(typeIds1\[0\], typeIds2\[0\]);
if (isBelongsTo) {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] belongs to typeIds2\[0\]");
} else {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] doesn't belong to typeIds2\[0\]");
}
// 6. 比较两种方式获取到的typeIds1\[0\]是否是typeIds2\[0\]的低层级类型
bool isLower = OH\_Utd\_IsLower(typeIds1\[0\], typeIds2\[0\]);
if (isLower) {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] is lower typeIds2\[0\]");
} else {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] is not lower typeIds2\[0\]");
}
// 7. 比较两种方式获取到的typeIds1\[0\]是否是typeIds2\[0\]的高层级类型
bool isHigher = OH\_Utd\_IsHigher(typeIds1\[0\], typeIds2\[0\]);
if (isHigher) {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] is higher typeIds2\[0\]");
} else {
    OH\_LOG\_INFO(LOG\_APP, "typeIds1\[0\] is not higher typeIds2\[0\]");
}
// 8. 销毁OH\_Utd\_GetTypesByFilenameExtension与OH\_Utd\_GetTypesByMimeType函数获取到的指针，同时销毁UTD指针
OH\_Utd\_DestroyStringList(typeIds1, typeIds1Count);
OH\_Utd\_DestroyStringList(typeIds2, typeIds2Count);
OH\_Utd\_Destroy(utd1);
OH\_Utd\_Destroy(utd2);