跳轉到內容

WebObjects/EOF/使用 EOF

來自華夏公益教科書

Jerry W. Walker

[編輯 | 編輯原始碼]

我本來很想像 Kieren 一樣回覆,但我理解在開始時 WebObjects 可能是多麼令人生畏。Kieren 的建議很好,請使用它。但也許以下內容也會有所幫助。

首先:我需要一些認真的幫助。一旦我使用 fetch 命令將資料庫中的一行作為物件引入,這工作正常,我如何訪問物件中的單元格?

在早期的專案中,你可能會使用 EOUtilities 及其快捷方式來執行你的提取操作。但讓我回到基礎,這樣你就可以在 API 參考中查詢類名。

在基本級別上,你需要定義或引用 7 個物件才能從你的關係資料庫中獲取資料

  • 一個 EOModel,它將你的關係表、行和列對映到 Java 類、例項和屬性。使用 EOModeler 建立它。
  • EOModel 中的一個實體,你想要從中獲取資料的實體(例如 Customer)。同樣,這應該由 EOModeler 建立。
  • 一個 EOQualifier,它定義了你提取操作的條件(例如,紐約的所有客戶)。
  • 一個 EOSortOrdering,它設定用於對結果進行排序的標準(例如,按 lastName、firstName、然後是 state 進行排序)。
  • 一個 EOFetchSpecification,它收集提取操作的標準,尤其是前 3 個物件。
  • 一個 EOEditingContext,用於管理你的資料庫資料。對於你的早期專案,請使用你的 Session 類提供的預設值。
  • 一個 NSArray,用於儲存已提取的物件(例如,myCustomers)。

實際上,你並不需要所有這些,但至少你需要一個 EOModel、一個實體、一個 EOEditingContext 和一個 NSArray 來儲存你的資料。

回到基本級別,我假設你或其他人已經建立了 EOModel 來將你的資料庫表對映到你的 Java 類。我還假設有人在該 EOModel 中定義了至少一個你感興趣的獲取其資料的實體。

你也可以透過使用 EOUtilities 中的快捷方式來避免 EOSortOrderings、EOQualifier 和 EOFetchSpecification。但是,無論你如何操作,最終都應該定義一個 NSArray 並用你的提取操作填充它。例如,在 WebObjects 元件中執行典型提取操作的程式碼可能如下所示

  EOEditingContext myEditingContext = session().defaultEditingContext();
  NSArray myCustomers  = EOUtilities.objectsMatchingKeyAndValue(myEditingContext, "Customer", "state", "New York");

在這一行中,我有一個名為 userGroup 的 int。如何從該物件中獲取該 int 的值並將其放入一個變數中?基本上,我的問題是,我如何訪問我引入的資料,以便在我的程式中使用它?

我的程式碼示例的結果是一個名為 myCustomers 的 NSArray,其元素是為你的 EOModel 中的“Customer”實體定義的 Java 類的例項。(通常,Java 類也會被命名為“Customer”。)

NSArray,myCustomers,是與你從資料庫中檢索的行相對應的 Java 物件的陣列。它們不再是行,而是被 EOF 轉換為成熟的 Java 物件,並且可以像這樣進行操作。陣列的第一個元素是檢索到的第一行,第二個元素是第二行,依此類推。

我嘗試過 EOUtilities.objectMatchingKeyAndValue,但到底什麼是 Key?我還嘗試過 EOUtilitlies.objectMatchingValues,但如何向字典中新增資料?

在我的程式碼示例中,我使用了 EOUtilities.objectsMatchingKeyAndValue() 方法。該方法的簽名為

  NSArray EOUtilities.objectsMatchingKeyAndValue(EOEditingContext ec, String entityName, String key, Object value)

所以從我的示例中,你可以看到

  ec = myEditingContext
  entityName = "Customer"
  key = "state"
  value = "New York"

特別是,為了回答你的問題,鍵是你要提取的實體的 EOModel 屬性名稱。如果你仔細觀察 EOModel,你會注意到每個實體都有三個名稱,即實體名稱、表示該實體的資料庫中的表的名稱,以及表示該實體的程式中的 Java 類的名稱。通常,後兩者是相同的,但不要混淆它們。

同樣地,每個實體的屬性都有一個對應的三個名稱集:實體屬性的名稱、表示該實體屬性的資料庫中的列的名稱,以及表示該實體屬性的 Java 類中的 Java 成員(方法或例項變數)。再次強調,通常後兩者是相同的,但不要混淆它們。

與其說“Java 成員(方法或例項變數)…”,我們只是說“鍵”。物件封裝應該允許我們不關心值是透過訪問器方法還是透過例項變數來表示。蘋果公司的一項名為 Key-Value-Coding(或 KVC)的專有技術允許我們引用該值,而不必關心。實際上,我們提供鍵名,並且可以完全忽略物件是透過訪問器方法還是透過例項變數提供該值。

第二:BLOB。我幾乎沒有找到關於 blob 的任何資訊。如何將它們放入資料庫?我知道人們不喜歡使用 BLOB,但我的導師希望我這樣做,所以我必須這樣做,並且如何在我需要將它們作為我的主程式呼叫的另一個程式的輸入時在程式中稍後呼叫它們?

你的 EOModel 定義了物件關係對映,以便給定表的任何列都可以對映到 Java 類方法或 iVar(鍵)。EOModel 定義了這種對映,不僅包括名稱對應關係,還包括屬性對應關係,以便 EOF 可以將資料庫表中給定行中的任何列值轉換為 Java 物件中的適當鍵值。

請記住,列值具有資料庫屬性,例如整數或 BLOB。同樣地,Java 物件中的鍵值具有類或原始值(例如,NSData 或 int)。如果你已正確設定 EOModel 對映,那麼只需在將該物件提取到陣列中後引用 Java 物件中的鍵即可。例如,從上面的示例中,要獲取單個客戶的資料

  Customer aCustomer = myCustomers.objectAtIndex(0);

你現在有一個由變數 aCustomer 引用的單個 Customer 物件。如果該 Customer 物件有一個由整數表示的 age 屬性,你可以像引用任何 Java 物件變數值一樣引用它

  int theAge = myCustomer.age();  // presuming that there is an age() accessor method, a fairly safe assumption for EOs.

如果要獲取的物件成員是客戶的照片,有些人會將該照片儲存在資料庫中(對於 WO 應用程式,我會在這樣做之前猶豫很長時間,但假設我被迫這樣做)。這些資料通常作為資料庫中的 BLOB 和 Java 類中的 NSData 物件儲存。在這種情況下,你可以透過以下方式檢索照片

  NSData customerPicture = aCustomer.picture();
華夏公益教科書