从 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 查询中使用时表现如此不同?

你在比较不同的东西,所以你会得到不同的结果。此处多次失败。

  1. mapEd.values()[0].BoatPick__c - 这需要第一个元素。随机的。你确定你只有 1 个元素吗?您可能会得到随机结果,祝您调试顺利。

  2. 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

  1. pick.getLabel() - 在代码中永远不要使用选项列表标签进行比较,除非你真的知道你在做什么。有人会将组织翻译成德语、法语等,你的代码就会崩溃。比较 getValue()