Уникальный идентификатор для NSManagedObject

Мне нужно получить уникальный идентификатор для типа NSManagedObject, который я создал. Он должен быть доступен, как только объект будет создан, никогда не изменится и будет полностью уникальным.

Это исключает NSManagedObjectID, поскольку это может измениться при сохранении контекста. Я полагаю, что метод -hash может быть неидентичным, если мои объекты имеют одинаковые свойства.

Мне бы очень хотелось избежать создания ненужного уникального поля UIID uniqueIdentifier на сущности, поскольку это кажется расточительным и беспорядочным. Есть ли здесь лучшая практика?

Ответ 1

попробуйте свойство URIRepresentation NSManagedObjectID. это очень уникальный идентификатор для текущего NSManagerObject, но будьте осторожны , пока NSManagedObject не будет сохранен, он дает только временный идентификатор, а не постоянный, и они может отличаться. (Я просто говорю это, потому что я не знаю, для чего и как вы хотите использовать уникальный идентификатор.)

ОБНОВЛЕНИЕ # 1

этот не является единственным воображаемым уникальным идентификатором, это уникальный чистый уникальный URL для каждого отдельного NSManagedObject (например, каждый файл имеет уникальный URL-адрес), используя их может снова найти оригинал NSManagedObject, после того как вы потеряли указатель. Я знаю, что это трудно понять, но это точка NSManagedObjectID и ее свойств.

(если вы не понимаете, как работают CoreData и их объекты, вы не будете отрицать ответ. пожалуйста, прочитайте больше документации вместо бессмысленного downvoting.)

ОБНОВЛЕНИЕ # 2

в соответствии с комментарием @NickLocking, я бы выделил смелую часть моего ответа выше:

до сохранения NSManagedObjectContext для нового и все еще несохраненного NSManagedObject классов имеет только временный уникальный идентификатор. Они получат постоянный уникальный идентификатор после того, как они будут сохранены в первый раз.

Ответ 2

В конце концов я решил, что нет хорошего способа сделать это, поэтому я просто создал поле uniqueIdentifier, в котором я применяю UUID для awakeFromInsert.

Сохранение объекта приводит к тому, что другие части моего приложения, в частности NSFetchedResultsControllers, обновляются до того, как я закончу объект. Я кратко попробовал NSManagedObjectContext getPermanentObjectIds: withError: method, считая, что он получит идентификаторы объектов без сохранения контекста, но на самом деле он просто сохраняет контекст.

Ответ 3

Единственными уникальными идентификаторами, предоставляемыми автоматически CoreData, является идентификатор объекта, но, как вы заметили, он изменится после его первоначального создания. Но прежде чем вы начнете использовать другой способ обойти это, вы можете захотеть определить что-то вроде следующего в вашем классе управляемых объектов:

- (NSManagedObjectID *)permID {
    if ([[self objectID] isTemporaryID]) {
        // Save myself, returning nil if there are errors
    }
    return [self objectID];
}

Этот подход не идеален каким-либо образом, особенно если вам нужно предоставить постоянный идентификатор до того, как объект находится в состоянии, в котором он действителен и может быть сохранен в базе данных. Но это позволит вам постоянно указывать постоянный идентификатор, если он вам не нужен, прежде чем объект может быть сохранен.