Programming__WebObjects-EOF-Using EOF-Batch Fetching
Batch Fetching
Petite Abeille
Here is a little example about how to batch fetch a bunch of EOFaults:
- First, given an array of faults, how to retrieve meta information
without triggering the fault:
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 );
- Second, for each EOFault build a qualifier:
EOEnterpriseObject aFault = (EOEnterpriseObject) someFaults.objectAtIndex(index);
EOKeyGlobalID aGlobalID = (EOKeyGlobalID) anEditingContext.globalIDForObject( aFault );
NSDictionary aPrimaryKey = anEntity.primaryKeyForGlobalID( aGlobalID );
EOQualifier aQualifier = anEntity.qualifierForPrimaryKey( aPrimaryKey );
- Finally, resolve the qualifier:
EOQualifier aQualifier = new EOOrQualifier( someQualifiers );
EOFetchSpecification aFetchSpecification = new EOFetchSpecification( anEntityName, aQualifier, null);
anEditingContext.objectsWithFetchSpecification?(aFetchSpecification?);
- Attached is the entire method.
h4. h4. h4. h4. h4. h4. h4. h1. =
Batch fetching Class method(s)
-
public static void batchFetchObjects(NSArray someObjects)
{
if ( ( someObjects !=_null_)_&&_(_someObjects.count()_>_0_)_)
{
NSMutableArraysomeFaults_=_new_NSMutableArray();
intcount_=_someObjects.count();
for_(_int_index_=_0;_index_<_count;_index++_)
{
ObjectanObject_=_someObjects.objectAtIndex(index);
if_(_EOFaultHandler.isFault(_anObject_)_==_true_)
{
someFaults.addObject(_anObject_);
}
}
if_(_someFaults.count()_>_0_)
{
NSMutableArraysomeQualifiers_=_new_NSMutableArray();
EOEnterpriseObjectaReferenceObject_=_(EOEnterpriseObject)_someFaults.lastObject();
EOAccessFaultHandleraFaultHandler_=_(EOAccessFaultHandler)_EOFaultHandler.handlerForFault(aReferenceObject);
EOEditingContextanEditingContext_=_aFaultHandler.editingContext();
StringanEntityName_=_aFaultHandler.globalID().entityName();
EOEntityanEntity_=_EOModelGroup.defaultGroup().entityNamed(_anEntityName_);
count_=_someFaults.count();
for_(_int_index_=_0;_index_<_count;_index++_)
{
EOEnterpriseObjectaFault_=_(EOEnterpriseObject)_someFaults.objectAtIndex(index);
EOKeyGlobalIDaGlobalID_=_(EOKeyGlobalID)_anEditingContext.globalIDForObject(_aFault_);
NSDictionaryaPrimaryKey_=_anEntity.primaryKeyForGlobalID(_aGlobalID_);
EOQualifieraQualifier_=_anEntity.qualifierForPrimaryKey(_aPrimaryKey_);
someQualifiers.addObject(_aQualifier_);
}
if_(_someQualifiers.count()_>_0_)
{
EOQualifieraQualifier_=_new_EOOrQualifier(_someQualifiers_);
EOFetchSpecificationaFetchSpecification_=_new_EOFetchSpecification(_anEntityName,_aQualifier,_null);
anEditingContext.objectsWithFetchSpecification(aFetchSpecification);
}
}
}
}
JonathanRochkind
CanyouexplaintheadvantagesoffetchingfaultsinsteadofjustlettingtheeditingContextreturnthem?-SamBarnum
A'fault'willnotactuallybefetcheduntilitisaskedfor.It'sjustanobjectinmemorythatsays'ifanyonetriestoaccessmydata,Iwillfetchitfromthedb.'
Youusuallydon'trunintoasituationwhereyouwanttocreatefaultsinsteadofjustfetchingobjectsfromtheEC---butwhenyou'redoingcomplicatedprogramming,itwillbeobviouswhenyoudo.IthinkjustoncehaveIactuallymanuallycreatedfaults.When_I_had_a_semantic_relationship,_but_couldn't_actually_model_the_relationship,_and_implemented_a_sort_of_half_baked_relationship_scheme_of_my_own_instead
However,I'mnotsurewhyyou'dwanttousetheabovecodewhentheEOEditingContextmethodfaultForRawRowisavailable.MakeanNSDictionarywhichhaspkattributenamesaskeysanddesiredvaluesastheirvalues,passittoyourEC.faultForRawRow?,you'vegotafault.Aheckofaloteasierthantheabove.
PreloadingRelationships
Thismethodcanbeusedtoprefetchrelationshipsinabatchinsteadofhavingthemfireonebyone.Thiscanbeusedtofinetunebatchfetchingincodeinsteadofdoingitinthemodel.Becarefulofhowyouusethismethod.Itwillforceafetchfromthedatabaseeveniftheobjectsarealreadycachedintheobjectstore.Usedincorrectlythiscanreduce,insteadofincrease,performance.
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();
}
}
}
Category:WebObjects