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