Вы никогда не должны инициализировать объекты Core Data вне контекста управляемого объекта - в этом просто нет смысла. Имея немного
Person *person = [[[Person alloc] init] autorelease];
не приносит вам пользы, поскольку вы не можете сохранить объект, манипулировать им или действительно сделать что-нибудь полезное, что Core Data предоставляет без контекста (и, следовательно, координатора модели и хранилища), его резервного копирования.
Вместо этого вы должны использовать комбо alloc
- init
только при первой вставке объекта в Core Data; для этого и используется метод initWithEntity:insertIntoManagedObjectContext:
. И вы правы, каждый раз, когда вы вызываете этот метод, вы вставляете новый объект в контекст Core Data и, следовательно, сохраняете, и вы можете получить дубликаты объектов, если не будете осторожны.
Что бы я порекомендовал вам, если вы запускаете код при каждом запуске, это создать запрос Core Data, который возвращает некоторый набор существующих объектов Person, и добавлять только объекты (используя метод инициализации), которые не существует в магазине Если объект уже существует, измените его вместо создания нового.
Хитрость заключается в том, чтобы заставить что-то подобное правильно работать. Вы не должны делать выборку Core Data для каждого контакта в адресной книге iPhone; многие маленькие фишки очень дорогие. Теоретически вы можете получить два NSSets - один из объектов Person и один из контактов - затем сравнить их по некоторому уникальному ключу (например, хэш имени и фамилии контакта). Я оставляю вам оптимизацию.
Ключевой момент заключается в следующем: не используйте alloc
и init
для объекта Core Data, если только вы не собираетесь впервые вставить этот объект в контекст . Вместо этого посмотрите на существующие объекты и измените их при необходимости.