从 SOQL 查询填充 Apex 映射
Populating an Apex Map from a SOQL query
// 我有一个名为 boatNames__mdt 的自定义元数据对象,我使用两种方法在 String[];[ 中获取选项列表值列表=13=]
第一种方法
Map<String, boatNames__mdt> mapEd = boatNames__mdt.getAll();
string boatTypes = (string) mapEd.values()[0].BoatPick__c;
// BoatPick__c is a textarea field (Eg: 'Yacht, Sailboat')
string[] btWRAP = new string[]{};
**btWRAP**.addAll(boatTypes.normalizeSpace().split(','));
第二种方法
string[] strL = new string[]{};
Schema.DescribeFieldResult dfr = Schema.SObjectType.boatNames__mdt.fields.BoatTypesPicklist__c;
// BoatTypesPicklist__c is a picklist field (Picklist Values: 'Yacht, Sailboat')
PicklistEntry[] picklistValues = dfr.getPicklistValues();
for (PicklistEntry pick : picklistValues){
**strl**.add((string) pick.getLabel());
}
使用 SOQL 查询映射
Map<Id, BoatType__c> boatMap = new Map<Id, BoatType__c>
([Select Id, Name from BoatType__c Where Name in :btWRAP]);
当我 运行 使用 SOQL 查询 (btWRAP[]) 的上述地图时,没有显示任何记录。
但是当我使用它时,使用 strl[] 记录确实出现了。
我惊呆了!
您能否解释一下为什么两个相同的 String[] 在精确的 SOQL 查询中使用时表现如此不同?
你在比较不同的东西,所以你会得到不同的结果。此处多次失败。
mapEd.values()[0].BoatPick__c
- 这需要第一个元素。随机的。你确定你只有 1 个元素吗?您可能会得到随机结果,祝您调试顺利。
normalizeSpace()
和 trim()
- 您 trim 字符串但拆分后您不会 trim 组件。你没有Sailboat
,你有{space}Sailboat
String s = 'Yacht, Sailboat';
List<String> tokens = s.normalizeSpace().split(',');
System.debug(tokens.size()); // "2"
System.debug(tokens); // "(Yacht, Sailboat)", note the extra space
System.debug(tokens[1].charAt(0)); // "32", space's ASCII number
尝试按“逗号,可选地后跟 space/tab/newline/any 其他空白符号”进行拆分:s.split(',\s*');
或在拆分结果的循环中调用 normalize
?
pick.getLabel()
- 在代码中永远不要使用选项列表标签进行比较,除非你真的知道你在做什么。有人会将组织翻译成德语、法语等,你的代码就会崩溃。比较 getValue()
// 我有一个名为 boatNames__mdt 的自定义元数据对象,我使用两种方法在 String[];[ 中获取选项列表值列表=13=]
第一种方法
Map<String, boatNames__mdt> mapEd = boatNames__mdt.getAll();
string boatTypes = (string) mapEd.values()[0].BoatPick__c;
// BoatPick__c is a textarea field (Eg: 'Yacht, Sailboat')
string[] btWRAP = new string[]{};
**btWRAP**.addAll(boatTypes.normalizeSpace().split(','));
第二种方法
string[] strL = new string[]{};
Schema.DescribeFieldResult dfr = Schema.SObjectType.boatNames__mdt.fields.BoatTypesPicklist__c;
// BoatTypesPicklist__c is a picklist field (Picklist Values: 'Yacht, Sailboat')
PicklistEntry[] picklistValues = dfr.getPicklistValues();
for (PicklistEntry pick : picklistValues){
**strl**.add((string) pick.getLabel());
}
使用 SOQL 查询映射
Map<Id, BoatType__c> boatMap = new Map<Id, BoatType__c>
([Select Id, Name from BoatType__c Where Name in :btWRAP]);
当我 运行 使用 SOQL 查询 (btWRAP[]) 的上述地图时,没有显示任何记录。 但是当我使用它时,使用 strl[] 记录确实出现了。
我惊呆了! 您能否解释一下为什么两个相同的 String[] 在精确的 SOQL 查询中使用时表现如此不同?
你在比较不同的东西,所以你会得到不同的结果。此处多次失败。
mapEd.values()[0].BoatPick__c
- 这需要第一个元素。随机的。你确定你只有 1 个元素吗?您可能会得到随机结果,祝您调试顺利。normalizeSpace()
和trim()
- 您 trim 字符串但拆分后您不会 trim 组件。你没有Sailboat
,你有{space}Sailboat
String s = 'Yacht, Sailboat'; List<String> tokens = s.normalizeSpace().split(','); System.debug(tokens.size()); // "2" System.debug(tokens); // "(Yacht, Sailboat)", note the extra space System.debug(tokens[1].charAt(0)); // "32", space's ASCII number
尝试按“逗号,可选地后跟 space/tab/newline/any 其他空白符号”进行拆分:s.split(',\s*');
或在拆分结果的循环中调用 normalize
?
pick.getLabel()
- 在代码中永远不要使用选项列表标签进行比较,除非你真的知道你在做什么。有人会将组织翻译成德语、法语等,你的代码就会崩溃。比较getValue()