WebObjects/EOF/使用 EOF/原始行
有沒有更好的方法從資料庫中獲取單個列,只獲取值,而不是鍵值對?
是的,使用 SQL 解決方案。只要您從關係資料庫中的列及其值的角度思考,您就是在 SQL 語言所圍繞的術語中思考。我將改述我在另一個關於此問題的執行緒中釋出的一條訊息。
這個問題是從“我有一張包含我想對它做一些事情的行表,現在我怎樣才能讓 WO 幫助我以我總是使用 SQL 的方式對我的表做這件事?”的角度提出的。
經驗豐富的 WO 開發人員會考慮我們正在面向物件 Java 應用程式中操作的物件圖,而不是我們儲存在關係資料庫中的行。改述問題,“我有一組具有屬性 'a' 的物件 'O'。如何獲取每個物件的該屬性的值?”
您最初問題的明顯答案是放棄 WebObjects。它是一個糟糕的技術,用於執行純 SQL 操作。只需發出 SQL“select myColumn from myTable;”,並忍受 SQL 作為企業應用程式開發技術的其他缺點。
另一方面,如果您想使用 WebObjects,您會發現用它構建問題的術語思考起來更容易,即類、物件、物件圖和麵向物件概念。從這些方面來看,資料庫更適合被認為是“物件儲存”,或用於儲存我的物件的地方,而不是關係資料庫。從這些方面來看,您會發現只需從資料庫中獲取物件並提取它們的值,就像您從任何其他物件中提取值一樣,更容易。
也許這些物件已經快取,我們不需要獲取原始行。也就是說,如果它們之前已經為某些其他操作而獲取,它們的快照已經快取在記憶體中,我們將進行冗餘獲取,而不是節約。
在這些可能性失敗的情況下,我仍然會在不引用原始行的前提下編寫獲取操作並使其工作。然後,如果結果明顯花費太長時間或需要太多記憶體,我會分析延遲發生的位置或記憶體消耗的位置,如果是在資料庫獲取中,那麼就會開始考慮原始行。重點是,引用原始行是最後的手段,而不是進入舊習慣的舒適區的一種方式,使用結果集。
那麼,直接轉到原始行有什麼缺點呢?
- 錯失了習慣 WO 方式的機會
- 繞過了內建在 WO 中的一些優雅功能,以幫助人們處理物件而不是行
- 可能對已快取在記憶體中的物件進行額外的資料庫訪問
- 從這個原始行決策中構建的弱面向物件設計的可能性更高
如果您採取自然的 WebObjects 路線並停止嘗試從表中獲取單個值,我之前回復中給出的建議在一般情況下仍然有效。不同的是,您將不再處理 NSDictionary,而是處理 Enterprise Objects 或 EO。在這種情況下,我提供的程式碼示例將看起來更像這樣
假設 myFetchSpec 存在,您在資料庫的該表中持久化的 EO 的類名為 MyObject,您感興趣的該類元素的名稱為 myAttribute,並且您已經獲取了一個名為 myObjects 的陣列,如下所示
NSArray myObjects = myEditingContext.objectsWithFetchSpecification(myFetchSpec); // Fetches instances of MyObject
NSDictionary anObject; // Iteration variable
NSDictionary selectedObject; // used to hold selected element from WOPopUpButton
現在,使用以下繫結設定您的 WOPopUpButton
list = myObjects;
item = anObject;
displayString = anObject.myAttribute
selection = selectedRow
總的來說,您會發現這比處理原始行更容易,因為您可以在 WebObjects Builder 中以視覺方式直接進行繫結,而不必像處理從原始行獲取操作產生的 NSDictionary 那樣,必須手動輸入它們。WOPopUpButton 應該顯示您想要的內容。