Overview
There are many ways to specify what Entities to fetch using EOF.
- Model a Fetch Specification in EntityModeler
- Create a FetchSpecification in code
- Use EOUtilities helper methods
- 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);