EOF-Using EOF-Fetching
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:
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
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);