之前介紹過PickList類型的聲明以及賦值,但是如何取出呢?一個sObject對象可以理解為一條數據。通過sObject直接取恐怕很難做到,因為他只會顯示一個值。這時候就要用到Schema命名空間中的類與方法以及System命名空間下的Schema類來實現。
Schema類
Schema命名空間和Schema類不是同一個概念。Schema類屬於System命名空間下,Schema命名空間包含很多類處理Schema元數據信息。
Schema類的方法包含schema 信息描述。
Schema類主要方法如下:
- public static Map<String, Schema.SObjectType> getGlobalDescribe():
返回一個map,這個map表示所有的sObject名稱(key)到sObject tokens(value)的map,其中tokens可以為在你的項目中標准的和自定義的Object對象。
這個map具有以下的特征:
1.動態的,根據權限在運行時生成sObject;
2.sObject名稱不區分大小寫;
3.key可以映射出Object是否是一個自定義對象;
4.key如果是標准的sObject則不需要前綴,否則需要加命名空間的前綴。
- public static List<Schema.DescribeDataCategoryGroupResult> describeDataCategoryGroups(String sObjectNames)
返回一個與指定的對象關聯的類別組列表.
- public static List<Schema.DescribeSObjectResult> describeSObjects(List<String> sObjectTypes)
返回指定的sObject的描述信息。通常可以先調用getGlobalDescribe()方法獲取組織中所有的對象列表,然后通過迭代遍歷使用此方法獲取指定的單個的sObject的元數據信息。
Schema命名空間
Schema命名空間下的類和方法用來處理schema 元信息(metadata),當實例化或者使用Schema類或者方法的時候,可以省略Schema命名空間。
以下的代碼中封裝了PickList的values的值的獲取方法,形參分別為需要獲取的sObjectName以及字段的名稱,如果不存在指定的sObjectName或者字段名稱沒有設置返回值,else代碼塊中,需要的童鞋可以自行設定不存在情況下返回的內容。Schema命名空間中主要類的學習可以參照代碼中的類查看相關方法。
1 public class PickListValuesUtil { 2 /* 3 通過sObjectName和指定字段獲取PickList的value值 4 */ 5 public static Map<String, object> getPicklistValues(String sObjectName, String sFieldName){ 6 Map<String, object> picValues= new Map<String, object>(); 7 Map<String, Schema.SObjectType> sObjectDescribeMap = Schema.getGlobalDescribe(); 8 if (sObjectDescribeMap.containsKey(sObjectName)) { 9 Map<String, Schema.SobjectField> sObjectFieldsMap = 10 sObjectDescribeMap.get(sObjectName).getDescribe().fields.getMap(); 11 if (sObjectFieldsMap.containsKey(sFieldName)) { 12 Schema.DescribeFieldResult sObjectFieldDescribe = sObjectFieldsMap.get(sFieldName).getDescribe(); 13 List<Schema.PicklistEntry> lPickEntryList = sObjectFieldDescribe.getPicklistValues(); 14 for (Schema.PicklistEntry tPicklistEntry : lPickEntryList) { 15 picValues.put(tPicklistEntry.getValue(), new Map<String,object>{ 16 'value' => tPicklistEntry.getValue(), 17 'isActive' => tPicklistEntry.isActive(), 18 'isDefaultValue' => tPicklistEntry.isDefaultValue(), 19 'label' => tPicklistEntry.getLabel() 20 }); 21 } 22 } else { 23 //TODO 不存在此字段的執行 24 } 25 } else { 26 // TODO 不存在此sObject的執行 27 } 28 return picValues; 29 } 30 }
調用方式如下所示:
Student__c具有Education__c字段,並且聲明類型為PickList.value值如圖1所示。通過輸出Map用來更好的查看Map內容。
Map<String,object> educationValues = SchemaUtil.getPicklistValues('Student__c','Education__c');
System.debug(educationValues);
輸出結果Map集合如下所示:
{
初中={isActive=true, isDefaultValue=false, label=初中, value=初中},
博士生={isActive=true, isDefaultValue=false, label=博士生, value=博士生},
大學={isActive=true, isDefaultValue=false, label=大學, value=大學},
小學={isActive=true, isDefaultValue=false, label=小學, value=小學},
教授={isActive=true, isDefaultValue=false, label=教授, value=教授},
研究生={isActive=true, isDefaultValue=false, label=研究生, value=研究生},
高中={isActive=true, isDefaultValue=false, label=高中, value=高中}
}
如果想獲取PickList的所有Value值,只需要取出集合后,通過Map的keySet()方法便可以獲取所有value內容,如果需要獲取相應的Entry信息,可以通過Map的value值。
本篇只是通過封裝的方法簡單講解獲取PickList的value值,如果想要詳細了解Schema命名空間以及System命名空間下的Schema類以及System命名空間下的sObject類,請查看官方API文檔,如果本篇有寫錯的地方歡迎批評指正。有疑問可以下方留言相互交流。

圖1
