跳转至内容

WebObjects/EOF/使用 EOF/批量获取

来自维基教科书,开放世界中的开放书籍

批量获取

[编辑 | 编辑源代码]

Petite Abeille

[编辑 | 编辑源代码]

以下是一个关于如何批量获取一堆 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);
       }
     }
   }
 }

Jonathan Rochkind

[编辑 | 编辑源代码]

你能解释一下获取故障而不是让 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();
        }
    }
 }
华夏公益教科书