EOF-Using EOF-Fetching

Last modified by David Avendasora on 2010/09/11 23:52

Overview

There are many ways to specify what Entities to fetch using EOF.

  1. Model a Fetch Specification in EntityModeler
  2. Create a FetchSpecification in code
  3. Use EOUtilities helper methods
  4. User helper fetch methods in your Entity.java (if generated using a more advanced EOGenerator* template).

*EOGenerator, Velocity EOGenerator, JavaEOGenerator

For complete details please read the EOF Documentation, the rest of this article will give some simple examples of the different kinds of fetches.

Examples

Model a Fetch Specification in EntityModeler

Create the Fetch Specfication

1. Open your model in EntityModeler and select an Entity to define a fetch spec for.
 2. Click on the "New Fetch Specification" tool bar button.
 3. In the Properties tab, give the new Fetch Specification a name. ie: userForLoginCredentials
 4. Enter a qualifier string in the text area provided. ie:

(username = $username) and (password = $password)

Binding variables (eg: $username) will be replaced by user supplied values when the Fetch Specification is called.

Fetch using a Modeled Fetch Specification


String username; //Assume exists
String password; //Assume exists
EOEditingContext editingContext; //Assume exists
NSMutableDictionary bindings = new NSMutableDictionary();
bindings.takeValueForKey(username, Person.USERNAME_KEY);
bindings.takeValueForKey(password, Person.PASSWORD_KEY);
String fetchSpecName = "userForLoginCredentials";
String entityName = Person.ENTITY_NAME;
NSArray objects = EOUtilities.objectsWithFetchSpecificationAndBindings(editingContext, entityName, fetchSpecName, bindings);

Create a Fetch Specification in code

Build a simple qualifier

EOKeyValueQualifier qualifier = new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value);

Build a more complex qualifier


EOKeyValueQualifier qual1 = new EOKeyValueQualifier(keyName1, EOQualifier.QualifierOperatorEqual, value1);
EOKeyValueQualifier qual2 = new EOKeyValueQualifier(keyName2, EOQualifier.QualifierOperatorEqual, value2);
EOAndQualifier finalQual = new EOAndQualifier(new NSArray(new object[] {qual1, qual2}));

Build a Fetch Specification


NSArray sortOrderings; // Assume Exists (or null for no defined sort)
EOQualifier qualifier; // Assume Exists (or null for all objects)
EOFetchSpecification fetchSpec = new EOFetchSpecification("EntityName", qualifier, sortOrderings);

Fetch with the Fetch Specification


String username; //Assume exists
String password; //Assume exists
EOEditingContext editingContext; //Assume exists
EOKeyValueQualifier usernameQual = new EOKeyValueQualifier(Person.USERNAME_KEY, EOQualifier.QualifierOperatorEqual, username);
EOKeyValueQualifier passwordQual = new EOKeyValueQualifier(Person.PASSWORD_KEY, EOQualifier.QualifierOperatorEqual, password);
EOAndQualifier credentialsQual = new EOAndQualifier(new NSArray(new object[] {usernameQual, passwordQual}));
EOFetchSpecification userForCredentialsFetchSpec = new EOFetchSpecification(Person.ENTITY_NAME, credentialsQual, null);
NSArray fetchedObjects = editingContext.objectsWithFetchSpecification(userForCredentialsFetchSpec);

EOUtilities

EOUtilities has several helper methods for simplifying your fetchs, we've already used "objectsWithFetchSpecificationAndBindings" above.

Also look at:

String username; //Assume exists
EOEditingContext editingContext; //Assume exists
EOEnterpriseObject eo = EOUtilities.objectMatchingKeyAndValue(editingContext, Person.ENTITY_NAME, Person.USERNAME_KEY, username);
 

EOEditingContext editingContext; //Assume exists
NSDictionary bindings; //Assume exists
EOEnterpriseObject eo = EOUtilities.objectMatchingValues(editingContext, Person.ENTITY_NAME, bindings);
 

EOEditingContext editingContext; //Assume exists
NSArray objects = EOUtilities.objectsForEntityNamed(editingContext, Person.ENTITY_NAME);
 

String username; //Assume exists
EOEditingContext editingContext; //Assume exist
NSArray objects = EOUtilities.objectsMatchingKeyAndValue(editingContext, Person.ENTITY_NAME, Person.USERNAME_KEY, username);
 


EOEditingContext editingContext; //Assume exists
NSDictionary bindings; //Assume exists
NSArray objects = EOUtilities.objectsMatchingValues(editingContext, Person.ENTITY_NAME, bindings);

EOGenerator Template Helper Methods.

Depending on your EOGenerator templates you may have auto generated methods in your _Entity.java class that will make fetching objects easier. Look for methods like:

EOEditingContext editingContext; //Assume exists
NSArray people Person.fetchAllPeople(editingContext);
 


EOEditingContext editingContext; //Assume exists
EOQualifier qualifer; //Assume exists
NSArray people Person.fetchPeople(editingContext, qualifier);