WebObjects/EOF/使用 EOF/批次獲取
外觀
以下是一個關於如何批次獲取一堆 EOFaults 的小例子。
- 首先,給定一個故障陣列,如何檢索元資訊
而不會觸發故障。
EOEnterpriseObject aReferenceObject = (EOEnterpriseObject)someFaults.lastObject(); EOAccessFaultHandler aFaultHandler = (EOAccessFaultHandler) EOFaultHandler.handlerForFault(aReferenceObject); EOEditingContext anEditingContext = aFaultHandler.editingContext(); String anEntityName = aFaultHandler.globalID().entityName(); EOEntity anEntity = EOModelGroup.defaultGroup().entityNamed( anEntityName );
- 其次,為每個 EOFault 構建一個限定符。
EOEnterpriseObject aFault = (EOEnterpriseObject) someFaults.objectAtIndex(index); EOKeyGlobalID aGlobalID = (EOKeyGlobalID) anEditingContext.globalIDForObject( aFault ); NSDictionary aPrimaryKey = anEntity.primaryKeyForGlobalID( aGlobalID ); EOQualifier aQualifier = anEntity.qualifierForPrimaryKey( aPrimaryKey );
- 最後,解析限定符。
EOQualifier aQualifier = new EOOrQualifier( someQualifiers ); EOFetchSpecification aFetchSpecification = new EOFetchSpecification( anEntityName, aQualifier, null); anEditingContext.objectsWithFetchSpecification?(aFetchSpecification?);
- 附件是整個方法。
// ===========================================================================
// Batch fetching Class method(s)
// ---------------------------------------------------------------------------
public static void batchFetchObjects(NSArray someObjects)
{
if ( ( someObjects != null ) && ( someObjects.count() > 0 ) )
{
NSMutableArray someFaults = new NSMutableArray();
int count = someObjects.count();
for ( int index = 0; index < count; index++ )
{
Object anObject = someObjects.objectAtIndex(index);
if ( EOFaultHandler.isFault( anObject ) == true )
{
someFaults.addObject( anObject );
}
}
if ( someFaults.count() > 0 )
{
NSMutableArray someQualifiers = new NSMutableArray();
EOEnterpriseObject aReferenceObject = (EOEnterpriseObject) someFaults.lastObject();
EOAccessFaultHandler aFaultHandler = (EOAccessFaultHandler) EOFaultHandler.handlerForFault(aReferenceObject);
EOEditingContext anEditingContext = aFaultHandler.editingContext();
String anEntityName = aFaultHandler.globalID().entityName();
EOEntity anEntity = EOModelGroup.defaultGroup().entityNamed( anEntityName );
count = someFaults.count();
for ( int index = 0; index < count; index++ )
{
EOEnterpriseObject aFault = (EOEnterpriseObject) someFaults.objectAtIndex(index);
EOKeyGlobalID aGlobalID = (EOKeyGlobalID) anEditingContext.globalIDForObject( aFault );
NSDictionary aPrimaryKey = anEntity.primaryKeyForGlobalID( aGlobalID );
EOQualifier aQualifier = anEntity.qualifierForPrimaryKey( aPrimaryKey );
someQualifiers.addObject( aQualifier );
}
if ( someQualifiers.count() > 0 )
{
EOQualifier aQualifier = new EOOrQualifier( someQualifiers );
EOFetchSpecification aFetchSpecification = new EOFetchSpecification( anEntityName, aQualifier, null);
anEditingContext.objectsWithFetchSpecification(aFetchSpecification);
}
}
}
}
你能解釋一下獲取故障而不是讓 editingContext 返回它們的優勢嗎?-SamBarnum
一個“故障”實際上不會被獲取,直到它被請求。它只是記憶體中一個說“如果有人嘗試訪問我的資料,我將從資料庫中獲取它”的物件。你通常不會遇到想要建立故障而不是從 EC 中獲取物件的場景——但是當你進行復雜的程式設計時,當你需要這樣做時,它會很明顯。我想我只有一次手動建立了故障。[當我有一個語義關係,但實際上無法對該關係建模,並且實現了一個半生不熟的半成品關係方案時。]
但是,我不確定為什麼你會想要使用上面的程式碼,當 EOEditingContext 方法 faultForRawRow 可用時。建立一個 NSDictionary,其中 pk 屬性名稱作為鍵,期望值作為其值,將其傳遞給你的EC.faultForRawRow?,你就得到了一個故障。比上面方法簡單多了。
此方法可用於批次預取關係,而不是讓它們一個接一個地觸發。這可以用來微調程式碼中的批次獲取,而不是在模型中進行。注意使用此方法的方式。它將強制從資料庫中獲取資料,即使物件已快取在物件儲存中。使用不當會導致效能下降而不是提升。
public static void preloadRelationship(NSArray sourceEOs, String relationshipName) {
if (sourceEOs.count() != 0) {
EOEnterpriseObject sampleEO = (EOEnterpriseObject) sourceEOs.objectAtIndex(0);
EOEditingContext ec = sampleEO.editingContext();
EOObjectStoreCoordinator osc = (EOObjectStoreCoordinator) ec.rootObjectStore();
osc.lock();
try {
EOEntity entity = EOModelGroup.modelGroupForObjectStoreCoordinator(osc)
.entityNamed(sampleEO.entityName());
EODatabaseContext databaseContext = EODatabaseContext.
registeredDatabaseContextForModel(entity.model(), osc);
EORelationship relationship = entity.relationshipNamed(relationshipName);
databaseContext.batchFetchRelationship(relationship, sourceEOs, ec);
}
finally {
osc.unlock();
}
}
}