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