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(); } } }