On 05/04/2010, at 6:51 AM, Ben Trumbull wrote:

> No, this is going the wrong way.  The objectID is the object's identity in 
> the persistent store (e.g. primary key).  You don't need to store pieces of 
> it somewhere else.
> 
> NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self == %@", 
> myobjectid];
> or
> NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self in %@", 
> objectidarray];
> 

Can I just clarify a couple of things about this:

1. The documentation says "Important:  If the receiver has not yet been saved, 
the object ID is a temporary value that will change when the object is saved." 
Now I want to use the IDs as keys in a dictionary, which of course copies the 
keys, and it is very likely that the objects will be added to the dictionary 
before saving, and referenced after save. I have checked, and the documentation 
is true - the object ID does get changed to a completely new one (different 
pointer) upon save, and also I note in the documentation, it warns about the 
file modification date, so in order to make sure this works, I believe I will 
have to do the following before I put it into my dictionary (I don't want to 
have my object directly as an instance variable of the managed object, since 
the object is at the UI layer, and the managed object layer shouldn't need to 
know about it):

        if ([[myManagedObject objectID] isTemporaryID]) {
                NSError *error = nil;
                if (![[myManagedObject managedObjectContext] 
obtainPermanentIDsForObjects:[NSArray arrayWithObject:myManagedObject] 
error:&error]) {
                        log4Error(@"Could not obtain permanent ID for %@", 
myManagedObject);
                        if (error) {
                                [NSApp presentError:error];
                        }
                        return nil;
                }
                NSPersistentDocument *document = [[[[self view] window] 
windowController] document];
                [document setFileModificationDate:[NSDate date]];
        }
...(create my object)...
        [myDictionary setObject:anObject forKey:[myManagedObject objectID]];

But when I try that, it throws an exception saying "Can't resolve how to assign 
objects to stores; Coordinator does not have any stores". 

The documentation says "Any object not already assigned to a store is assigned 
based on the same rules Core Data uses for assignment during a save operation 
(first writable store supporting the entity, and appropriate for the instance 
and its related items).". 

My store class is registered in applicationWillFinishLaunching:, and everything 
seems to work OK while saving, so I would have expected it to be able to create 
one if it needed to, but the error seems to imply that I have to manually 
create my atomic store and add it to the coordinator before this, in order to 
be able to get it to generate the permanent ID. 

If this is the case, sure, I can create one, but I'm not sure what URL to give 
it seeing as the user hasn't saved it yet, and besides, I'm not sure if it will 
have any impact on the behavior when the user actually does save it.

I just want to check that I haven't gone off on the wrong path again with this, 
and that I really do have to do all this to get a stable ID...it just seems to 
me that if I have to do all this just to get a stable ID, maybe there is some 
more fundamental design issue with my program, or concept I am not getting, and 
maybe I am trying to work against the way the framework is supposed to be used.



2. From the Predicate Programming Guide, it says that SELF refers to the 
objects that are being searched. I read through the whole guide and found 
nothing there stating that it could also refer to the managed object ID. I did 
eventually find it in the Core Data Programming Guide, but even when I knew 
what I was looking for, it took ages to find. I really think it should be 
mentioned in the Predicate Programming Guide - should I file a bug against that 
documentation?


Thanks

Gideon_______________________________________________

Cocoa-dev mailing list ([email protected])

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 [email protected]

Reply via email to