本篇参考:

salesforce 零基础开发入门学习(十一)sObject及Schema深入

https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_entitydefinition.htm

https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_fielddefinition.htm

想获取metadata相关的信息,我们第一件事想起来的可能就是 Schema Namespace,通过Schema命名空间的 DescribeSObjectResult 以及 DescribeFieldResult可以搞定很多事情。然而不是所有的metadata信息或者表字段信息都可以在 Schema命名空间下获取,今天我们讲一下表字段的 Durable Id的概念以及 EntityDefinition 以及 FieldDefinition的简单实用。

我们先来看下方的两个图的区别。

下图为Account表的自定义字段,我们看到 FieldAndRelationships后面是一个15位的ID

下图为Account的标准字段,我们可以看到URL直接展示的是Field API 名称。

其实不只是标准和自定义字段的区别,表同样适用于这个情况。所以问题来了, 15位ID是什么? 如何获取到?

15位ID是 Durable Id,用于作为表或者字段的唯一标识符。在使用之前一定要检索这个值,因为这个值不能保证从一个版本到另一个版本都是一样的。为了简化查询,可以使用这个字段。

接下来的问题就是如何获取,可能大部分人第一想法就是查看 Schema命名空间,然后查看 DescribeObjectResult以及DescribeFieldResult这两个类的方法,很可惜,这两个类里面都没有相关的方法,那如何进行获取呢? 揭示今天的主角, Tooling API中的 EntityDefinition 以及 FieldDefinition这两个表。

一. FieldDefinition以及 EntityDefinition简单介绍

EntityDefinition:此表用于提供对标准和自定义表的基于行级别的针对metadata的访问。基于此表的查询,也可以查询相关的子表的查询,官方文档中也同样做了一些描述。我们看一下下面的简单的例子:下图的搜索用于搜索Account表的 DeveloperName, NewUrl,同时搜索 Account的两个子信息。

1. Account表所有的字段信息,字段信息搜索了 DeveloperName以及 DurableId,

2. Account表所有的Record Type信息。

SELECT DeveloperName,QualifiedApiName,NewUrl,
(SELECT Id, DeveloperName, DurableId FROM Fields),
(SELECT Name FROM RecordTypes)
FROM EntityDefinition
WHERE QualifiedApiName = 'Account'

除了上述的子查询以外,此表还有很多的允许查询的子表信息,更多可以查看官方文档。我们看一下输出的大致信息以及结构

通过这里我们可以看出来结构,以及针对标准和自定义字段的 DurableId的区别了。

FieldDefinition:此表用于提供对标准和自定义字段的基于行级别的针对metadata的访问。上面的demo中返回的结构还是太过庞大,如果我们只想返回某个字段的信息,我们便可以通过 fieldDefinition的查询进行更好的结果返回,下方demo返回 Account Industry的信息

SELECT Id, DeveloperName, DurableId
FROM FieldDefinition
WHERE DeveloperName = 'Industry'
AND EntityDefinition.QualifiedApiName = 'Account'

我们可以看一下结果展示

二. demo

这两个表有很多字段,感兴趣的小伙伴可以自行查看每个字段的含义。我们再结合着上一篇的demo进行优化,封装一个方法,通过object api name以及field api name进行获取custom metadata type中维护的default value.

public with sharing class CommonUtils {
public static String getDefaultValueFromMetadataType(String objectApiName, String fieldApiName) {
List<Default_Value__mdt> defaultValueList = Default_Value__mdt.getAll().values();
String result = '';
String durableId;
List<FieldDefinition> fieldDefinitionList = [SELECT Id, DurableId
FROM FieldDefinition
WHERE EntityDefinition.QualifiedApiName = :objectApiName
AND QualifiedApiName = :fieldApiName];
if(fieldDefinitionList != null && !fieldDefinitionList.isEmpty()) {
durableId = fieldDefinitionList.get(0).DurableId;
} if(String.isNotBlank(durableId)) {
for(Default_Value__mdt valueItem : defaultValueList) {
if(durableId.equalsIgnoreCase(valueItem.Field_Name__c)) {
result = valueItem.Default_Value__c;
}
}
} return result;
}
}

简单调用的结果显示:

总结: 此篇仅是对于上一篇的补充,简单介绍了 DurableId以及 EntityDefinition和 FieldDefinition的概念和使用。篇中没有介绍特别详细字段以及limitation,感兴趣的可以自行查看。篇中有问题欢迎指出,有不懂欢迎留言。

salesforce零基础学习(一百二十八)Durable Id获取以及相关概念浅入浅出的更多相关文章

  1. salesforce 零基础学习(二十八)使用ajax方式实现联动

    之前的一篇介绍过关于salesforce手动配置关联关系实现PickList的联动效果,但是现实的开发中,很多数据不是定死的,应该通过ajax来动态获取,本篇讲述通过JavaScript Remoti ...

  2. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  3. salesforce 零基础学习(二十二)Test简单使用

    本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...

  4. salesforce 零基础学习(二十)简单APP制作

    本篇参考链接:https://developer.salesforce.com/trailhead/project/salesforce_developer_workshop 本篇讲述的是最简单的AP ...

  5. salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※

    我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...

  6. salesforce 零基础学习(二十四)解析csv格式内容

    salesforce中支持对csv格式的内容批量导入,可以使用dataloader,然而有些情况下,当用户没有相关权限使用dataloader导入情况下,就的需要使用VF和apex代码来搞定. 基本想 ...

  7. salesforce零基础学习(七十八)线性表链形结构简单实现

    前两篇内容为栈和队列的顺序结构的实现,栈和队列都是特殊的线性表,线性表除了有顺序结构以外,还有线性结构. 一.线性表的链形结构--链表 使用顺序存储结构好处为实现方式使用数组方式,顺序是固定的.所以查 ...

  8. salesforce 零基础学习(五十八)通过sObject的field返回其对应的基础类型

    项目中有时候会要求通过sObject的Field的type类型返回其对应的基本类型,然后对其进行相关的处理,创建sObject的field可以选择的type类型是固定多的. 上述类型可以转换成几种基本 ...

  9. salesforce 零基础学习(三十八)Translate 的使用(国际化处理)

    本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...

  10. salesforce 零基础学习(二十九)Record Types简单介绍

    在项目中我们可能会遇见这种情况,不同的Profile拥有不同的页面,页面中的PickList标签可能显示不同的值.这个时候,使用Record Types可以很便捷的搞定需求. Record Types ...

随机推荐

  1. 第二章:用Python对不同的商品销售数据进行预测分析

    文章目录 项目背景 获取数据 线性数据预测 非线性数据预测 源码地址 本文分享知识: os 模块获取上一级目录的绝对地址 pands 读取 sqlite3 数据库中的数据 用sklearn中的线性回归 ...

  2. 20192305 王梓全Python程序设计实验一报告

    20192305 王梓全Python程序设计实验一报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年4月 ...

  3. 1903021126 申文骏 Java 第四周作业 Java分支语句学习

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第四周作业 博客名称 1903021126  申文骏  Java 第四周作业 Java分支语句学习 要求 每道题要有题目,代码( ...

  4. 使用git钩子防止合并分支

    git是一款实用的版本管理工具,我们通过git init初始化一个git仓库,git会在当前目录为我们生成一个.git/目录,用来管理我们的版本文件信息. 在这个目录中有一个二级目录.git/hook ...

  5. DML操作数据

    添加数据 insert into 表名(列的名称)(数据);ps:列的名称用`  `包围可以减少出错 添加全部数据的时候可以把列的名称省略: 修改数据 update 表名  set 列名=数据,列名= ...

  6. AirSim 自动驾驶仿真 (2-3) python控制无人机 win10

    1首先搭建好环境 参考 2 python控制 https://blog.csdn.net/Zhaoxi_Li/article/details/108002544 官方代码位置 自己pythonj教程 ...

  7. nginx启动命令

    启动加载配置文件 [root@172 sbin]#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 检查配置信息是否正确 ...

  8. linux一些指令

    一.           文件操作命令 查看当前目录下的文件或文件夹 详细查看ls –l 每列代表不同的意义: 第一列drwxr-xr-x  表示权限, n  其中第一个字符d表示 目录(可能有b-块 ...

  9. MAC读写模式自动挂载硬盘/不自动挂载硬盘

    一.卸载硬盘 sudo umount /dev/disk1s1 自己从磁盘工具获取设备ID 或使用终端命令:diskutil list 来获取 二.新建文件夹以供挂载,位子自选 sudo mkdir ...

  10. char值转换为int怎么才能不是ASCII值

    直接将char类型的变量强制转换为int类型是不行的,那样只会传递变量所对应的ASCII码 怎么才能将char类型转换为int类型呢?String类型的可以通过方法转换为int类型.那是不是可以将ch ...