跳轉至內容

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();
        }
    }
 }
華夏公益教科書