創建好的數據表在數據庫中查看有不少方式,本人目前採用如下兩種方式查看數據表。java
1.採用schema Builder查看錶結構以及多表之間的關聯關係,能夠登陸後點擊setup在左側搜索框輸入schema Builder 或者build-->schema Builder進入;sql
2.採用force.com Explorer經過本身寫查詢語句來查詢數據。數據庫
此連接爲force.com Explorer的下載連接: http://force-com-explorer-beta.software.informer.com/json
下載完成後經過用戶,密碼,Security token帳號登錄便可,見(篇一)。網站
此篇主要講解表字段的Data type的每種類型以及多表關聯下的SOQL查詢,因爲多表關聯涉及到Data type中的look up或者master-detail,因此先講一下Data type類型。ui
一)Data type加密
當數據表建立表的列時,會選擇Data Type,不一樣的Data Type在頁面處理以及數據插入時會有不一樣的處理。並且不一樣的字段會有其相對應的數據類型與之對應。url
1.Auto Number:系統生成的序列號,經過自身定義的形式顯示,爲每條新紀錄自動遞增數;spa
2Formula:聲明一個計算式,功能很強大,之後會單獨篇章講解formula用法;debug
3.Lookup Relationship:建立連接一個對象和另外一個對象的關係,建立關係後,經過一個對象能夠訪問另外一個對象的內容信息;
4.Master-Detail Relationship:建立一個特殊的父子關係(主從關係),和lookup Relationship 的相同與差別在下面介紹;
5.External Lookup Relationship:建立一個對象和另外一個額外對象的關係。其中這個對象的數據存儲在額外對象的數據源中;
6.Checkbox:聲明一個布爾類型;
7.Currency:聲明一個貨幣類型;
8.Date:聲明一個Date類型,用戶在前臺綁定後能夠直接使用Date類型相應的控件;
9.Date/Time:聲明一個Date和Time類型,用戶選擇日期後,日期和當前時間便賦值到輸入域;
10.Email:聲明一個Email類型;
11.Geolocation:聲明一個位置的類型,此類型包含經緯度信息;
12.Number:容許輸入任何的數字,若是輸入的全是0則所有移除;
13.Percent:聲明一個百分比類型;
14.Phone:聲明一個手機號碼類型,輸入的內容自動轉換成此類型;
15.Picklist:聲明一個列表類型,相似於HTML中的<select><option></option></select>關係,下面會有例子講解;
16.Picklist(Multi-Select):聲明一個列表類型,區別上面的爲容許多選;
17.Text:聲明一個字符串類型,最大長度爲255;
18.Text Area:和Text類型類似,區別爲內容能夠換行;
19.Text Area(Long):和Text Area類似,最大長度爲131072;
20.Text Area(Rich):富輸入框,能夠存儲圖片等;
21.Text(Encrypted):能夠加密的形式存儲;
22.URL:聲明一個URL類型。
在項目中有一些是咱們須要常常用到的類型,好比2,3,4,6,7,8,9,10,12,15,16,17,19,20,22.有一些類型配置相對簡單,選中Data type 類型,輸入字段名稱而後一直執行下一步即可以完成操做;有一些類型配置則相對麻煩。接下來主要描述Lookup Relationship,Master-detail Relationship,Picklist這三種類型配置。
1)PickList
PickList聲明一組數據,相似HTML中的選擇框。一般用於肯定的內容選擇,好比學生表能夠聲明學生的學歷--Education__c字段。他的值爲肯定範圍的:幼稚園,小學,初中,高中,大學。。。因此這個字段能夠聲明爲PickList類型字段。即此字段適用於值是肯定範圍的,有窮的狀況。
聲明PickList操做步驟以下:
1.若是存在Student表狀況下,在setup-->create-->Objects下找到Student,點擊進入。若是不存在Student,則按照上一篇步驟新建Student表;
2.在Custom Fields & Relationships模塊下點擊add新建一個字段並選擇PickList點擊Next;
3.在Field Label 中輸入Education,鼠標移動到Field Name中則自動輸入。將Value選擇第二個Enter Value ,並在輸入框中輸入相應值,如圖1所示;
4.一直選擇Next,最後點擊Save按鈕新增PickList類型字段。
圖1
2)Lookup Relationship 與Master-detail Relationship
兩者都可以關聯兩個數據表,實現其餘數據庫語言相似join功能,兩者區別以下:
1.master detail關係比較緊密,能夠自動進行級聯刪除,Lookup 關係相對靈活,不能夠級聯刪除,若是刪除操做,則須要先刪除從表,再刪除主表操做;
2.用lookup容許父爲空,master不容許--master模式須要級聯刪除,若是master狀況父爲空則沒法級聯刪除。
具體使用那種分數據表關係,若是數據表關聯比較緊密,刪除時須要級聯刪除則能夠選擇master-detail模式,若是關係相對鬆散,但願表之間靈活控制,則推薦使用lookup關係。
以權限表和角色表兩個表關係來引入Look up.
作過權限管理的人都知道,一個權限能夠對應多個角色,一個角色能夠分配多種權限,權限與角色是多對多關係。好比,查看文章的權限能夠是管理員具備查看權利,也能夠是普通用戶具備查看的權利;一個管理員能夠有查看的權限,也能夠有修改的權限。因此應該引入一箇中間表角色權限表做爲中間表,實現以上的數據表結構構造,如圖2所示。
圖2
經過圖2能夠看出,PRIVELEGEROLE__c外鍵依賴於PRIVELEGE__c 以及 ROLE__c,即PRIVELEGEROLE__c的PRIVELEGEID__c字段與PRIVELEGE__c的Id字段進行關聯,PRIVELEGEROLE__c的ROLEID__c的Id字段進行關聯,經過這兩個關聯字段能夠訪問到這兩個關聯的表中。訪問方式比較特殊,即經過PRIVELEGEID__r能夠訪問到PRIVELEGE表(對應的sObject爲PRIVELEGE__c)中的字段,經過ROLEID__r能夠訪問到ROLE表(對應的sObject爲ROLE__c)中的字段。
注意:這三個表若是按照Master-Detail關係狀況,則PRIVELEGE__c和ROLE__c爲主表,PRIVELEGEROLE__c爲從表(外鍵依賴於另外兩個表)。經過外鍵依賴的sObject,將sObject最後的c改爲r即可以訪問此表。eg:
SELECT PRIVELEGEID__r.Id,PRIVELEGEID__r.PRIVELEGENAME__c, ROLEID__r.ROLENAME__c, Id FROM PRIVELEGEROLE__c
經過上面例子能夠看出:PRIVELEGEROLE__c表中的PRIVELEGEID__c是表中的一個字段,經過LookUp關係關聯到PRIVELEGE__c,則PRIVELEGEID__r則至關於PRIVELEGE__c表的一個引用,經過PRIVELEGEID__r則能夠訪問PRIVELEGE__c表中的數據,爲了更加明確的瞭解,將數據表查詢結果經過JSON形式顯示,便會更加的一目瞭然。經過查詢輸出的json結果能夠看出,PRIVELEGEID__r他的類型爲PRIVELEGE__c,而且把此條記錄中的PRIVELEGE__c須要的字段信息查出,ROLEID__r類型爲ROLE__c,而且將此條記錄中ROLE__c表須要的字段信息查出。推薦下方的網頁查看json,它能夠將輸出的混亂的json格式變得整潔,加強可讀性。
json在線轉換網頁:http://json.parser.online.fr/
查詢結果轉成JSON語句:
String queryString = 'SELECT PRIVELEGEID__r.Id,PRIVELEGEID__r.PRIVELEGENAME__c, ROLEID__r.ROLENAME__c, ROLEID__c, Id FROM PRIVELEGEROLE__c'; List<PRIVELEGEROLE__c> prs = Database.query(queryString); String queryJson = JSON.serialize(prs); System.debug(queryJson);
如下爲查詢的輸出json結果。
1 [ 2 { 3 "attributes":{ 4 "type":"PRIVELEGEROLE__c", 5 "url":"/services/data/v36.0/sobjects/PRIVELEGEROLE__c/a03280000089RbkAAE" 6 }, 7 "PRIVELEGEID__c":"a012800000KufW5AAJ", 8 "ROLEID__c":"a0228000008fwJ6AAI", 9 "Id":"a03280000089RbkAAE", 10 "PRIVELEGEID__r":{ 11 "attributes":{ 12 "type":"PRIVELEGE__c", 13 "url":"/services/data/v36.0/sobjects/PRIVELEGE__c/a012800000KufW5AAJ" 14 }, 15 "Id":"a012800000KufW5AAJ", 16 "PRIVELEGENAME__c":"權限添加" 17 }, 18 "ROLEID__r":{ 19 "attributes":{ 20 "type":"ROLE__c", 21 "url":"/services/data/v36.0/sobjects/ROLE__c/a0228000008fwJ6AAI" 22 }, 23 "Id":"a0228000008fwJ6AAI", 24 "ROLENAME__c":"角色添加" 25 } 26 } 27 ]
接下來說解如何在網站中構建出LookUp關係,若是不懂如何建立表和字段,請查看上一篇內容。
1.建立PRIVELEGE表,按照圖二的表結構能夠看出,須要建立PRIVELEGENAME和PRIVELEGEDESCRIBE兩個字段,建立後,系統會自動爲其建立API Name;
2.建立ROLE表,按照圖二的表結構能夠看出,須要建立ROLENAME和ROLEDESCRIBE兩個字段,建立後,系統會自動爲其建立API NAME;
3.建立PRIVELEGEROLE表;
4.建立和PRIVELEGE表的依賴,新增一個字段,Datatype選擇LookUp,點擊Next,如圖3;
5.在Relate To下拉框處選擇須要關聯的表,此處選擇PRIVELEGE表,如圖4,而後點擊Next;
6.在Field Label 輸入字段名稱,此處輸入PRIVELEGEID,鼠標移動到Field Name,則自動賦值,如圖5,一直點擊next;
7.點擊save&new按鈕,重複4--6步驟,將於ROLE表關聯的字段建立,Field Label處輸入ROLEID,最後save,關聯結束,如圖6.
圖3 圖4
圖5 圖6
使用Master-Detail關係和使用LookUp關係建立基本相同,這裏不在作說明。
接下來講明DML操做。如今說一下增刪查操做,改操做和其餘相同,則再也不講述。
上述代碼查詢出來的內容爲PRIVELEGEROLE__c對象,那麼如何檢索出須要的PRIVELEGE__c對象的字段或者ROLE__c對象的字段呢?
apex提供簡單的方式來處理,即若是各層級嵌套,則能夠經過相似A.B.C方式來獲取須要的內容。查詢操做代碼將與刪除操做代碼在下方一塊兒顯示。
由於表之間存在關聯關係,因此進行增長操做時,應先處理主表,而後再處理從表;進行刪除操做時,應先刪除從表,在刪除主表。
這裏在囉嗦一下:主表表示獨立的表,從表表示外鍵依賴於其餘表的表。主表有時也被成爲父表,子表有時也被成爲子表,上述的例子中,PRIVELEGEROLE爲從表,其餘爲主表
增長操做代碼舉例:
PRIVELEGE__c privelege = new PRIVELEGE__c(PRIVELEGENAME__c='權限添加',PRIVELEGEDESCRIBE__c='權限描述'); ROLE__c role = new ROLE__c(ROLENAME__c='角色添加',ROLEDESCRIBE__c='角色描述'); insert privelege;//執行insert後,privelege的ID字段便會自動被賦值,且惟一 insert role; ID roleId = [select Id from ROLE__c limit 1][0].ID; ID privelegeId = [select Id from PRIVELEGE__c limit 1][0].ID; PRIVELEGEROLE__c privelegeRole = new PRIVELEGEROLE__c(); privelegeRole.ROLEID__c = roleId; privelegeRole.PRIVELEGEID__c = privelegeId; insert privelegeRole;
//添加操做須要先添加主表,主表添加之後,ID便自動賦值,而後再取出ID操做從表。
刪除操做代碼舉例:
1 String deletePrivelegeRoleSql = 'SELECT ROLEID__c, 2 Id,PRIVELEGEID__r.ID,ROLEID__r.ID' + 3 'FROM PRIVELEGEROLE__c'; 4 List<SObject> privelegeRoles = Database.query(deletePrivelegeRoleSql); 5 6 if(privelegeRoles.size() > 0) {//查詢有記錄的時候纔對子表進行刪除操做 7 8 PRIVELEGEROLE__c privelegeRole = (PRIVELEGEROLE__c)privelegeRoles[0]; 9 ID privelegeId = privelegeRole.PRIVELEGEID__r.ID;//經過層級A.B.C能夠查出須要使用的變量 10 ID roleId = privelegeRole.ROLEID__r.ID; 11 try { 12 Database.delete(privelegeRole.Id); 13 } catch(Exception e) { 14 System.debug('error occured when deleting privelegerole!'); 15 } 16 17 try { 18 Database.delete(privelegeId); 19 Database.delete(roleId); 20 } catch(DmlException e) { 21 System.debug('error occured when deleting privelege or role'); 22 } 23 }
//先刪除從表,在刪除主表。刪除從表後,表數據即消失。因此在表數據刪除之前,須要先將須要的數據取出,好比上述的ID字段
經過此篇,能夠對錶關聯操做有一個基礎的認識,若是須要詳細瞭解內容,請查看官方的PDF文檔。若是篇中有寫錯的地方,歡迎批評指正。有不懂得地方也能夠留言。
下一篇將介紹批處理的簡單使用。