Jerry,

Using just the mapping model seems okay if your Core Data) Model is simple, but 
most likely it would bloat over time and the best thing to do would be to 
customize the migration process. Actually it's not that hard and in fact makes 
sense.

To start with you create a subclass of NSEntityMigrationPolicy to say 
MyMigrationPolicy. In your mapping model you have to handle the mapping of say 
old entity "Foo" whose attribute "Bar" is of type Int16 in old model and Bool 
in new model. Now in you mapping model specify "MyMigrationPolicy" as the 
"Custom Policy" for attribute you wish to manage in a custom way.
Now implement the method:
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject 
*)inSourceInstance
                                                                          
entityMapping:(NSEntityMapping *)inMapping
                                                                                
        manager:(NSMigrationManager *)inManager
                                                                                
          error:(NSError **)outError

In your MyMigrationPolicy class and deal with only the entities that you're 
interested in.

A sample implementation would look something like:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject 
*)inSourceInstance
                                                                          
entityMapping:(NSEntityMapping *)inMapping
                                                                                
        manager:(NSMigrationManager *)inManager
                                                                                
          error:(NSError **)outError
{
        NSManagedObject *newObject;
        NSEntityDescription *sourceInstanceEntity = [inSourceInstance entity];
        
        if ( [[sourceInstanceEntity name] isEqualToString:@"Foo"] )
        {
                newObject = [NSEntityDescription 
insertNewObjectForEntityForName:@"Foo"
                                                                                
                  inManagedObjectContext:[inManager destinationContext]];

                
                NSDictionary *keyValDict = [inSourceInstance 
committedValuesForKeys:nil];
                NSArray *allKeys = [[[inSourceInstance entity] 
attributesByName] allKeys];
                NSInteger i, max;
                max = [allKeys count];
                for (i=0 ; i< max ; i++)
                {
                        // Get key and value
                        NSString *key = [allKeys objectAtIndex:i];
                        id value = [keyValDict objectForKey:key];
                        if ( [key isEqualToString:@"Bar"] )
                        {
                                [newObject setValue:[NSNumber 
numberWithBool:[value boolValue]] forKey:key];
                        }
                        else
                                [newObject setValue:value forKey:key];
                }
                
        }
        
        [inManager associateSourceInstance:inSourceInstance
                           withDestinationInstance:newObject
                                          forEntityMapping:inMapping];

        return YES;
}




Thanks,

Chaitanya Pandit
Architect
Expersis Software Inc.

On May 4, 2010, at 7:23 AM, Jerry Krinock wrote:

> When doing Core Data versioning, when creating a Mapping Model, when writing 
> Custom Value Expressions, I understand that the syntax to be used is that 
> described in the Predicate Programming Guide > Predicate Format String Syntax.
> 
> But I can't figure out how to do non-trivial mappings like these...
> 
> Example 1:  Old data model attribute type is an Integer16.  I want to map 
> this to a Boolean which is NO if the old value was 0 and YES if != 0.
> 
> Example 2:  Old and new data model attribute types are both String.  If the 
> string is "Joe", I want to map it to "Jose"; else, map the original value.
> 
> It seems like the concept of "mapping" should support stuff like this, but I 
> can't find any such examples.  In MigratingDepartmentAndEmployees, all I see 
> is mapping from one attribute name to another. 
> 
> Relations get a complicated expression like this generated automatically:
> 
> FUNCTION($manager, 
> "destinationInstancesForEntityMappingNamed:sourceInstances:" , 
> "EmployeeToEmployee", $source.employees)
> 
> but I have no idea where that FUNCTION keyword comes from (it's not listed as 
> a reserved word in the Predicate Programming Guide).  It seems like I should 
> be able to make my own FUNCTION to implement the stuff I need in my examples. 
>  Is this possible?
> 
> Thanks,
> 
> Jerry Krinock
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/chaitanya%40expersis.com
> 
> This email sent to chaita...@expersis.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to