Как эффективно обрабатывать временные объекты в Базовых данных, поскольку objectID изменяется между временными объектами и постоянными объектами? - PullRequest
4 голосов
/ 07 апреля 2011

Каков наилучший способ обработки временных объектов в Базовых данных? Я видел решения, где создаются временные контексты, где они вставляются в нулевой контекст и т. Д.

Однако вот проблема, которую я вижу в обоих этих решениях. Я использую базовые данные для своей объектной модели и в некоторых моих представлениях храню NSSet базовых данных. Проблема, с которой я столкнулся, заключается в том, что при сохранении объекта изменяется идентификатор объекта, что фактически делает недействительным все, что хранится в любом наборе NSSet, поскольку теперь isEqual и hash различаются. Хотя я мог сделать недействительным объект, хранящийся в NSSet, он часто не практичен и, конечно, не всегда прост.

Вот что я рассмотрел:

1) переопределить метод isEqual и хэш для NSManagedObject (очевидно, плохо)

2) не помещайте NSManagedObject в NSSet (используйте NSDictionary, где ключ всегда фиксирован)

3) использовать совершенно другой тип для хранения в NSSet, где я мог бы правильно реализовать методы isEqual и хеш-кода

У кого-нибудь есть лучшее решение для этого?

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

ManagedObjects в NSSet - это звучит как отношение базовых данных. Почему бы просто не сохранить ваши временные управляемые объекты в отношениях, а Core Data позаботиться о проблемах, с которыми вы сейчас сталкиваетесь. Затем вы можете сконцентрироваться на том, когда и как удалить временные объекты, или разорвать отношения или что-то еще необходимое.

1 голос
/ 13 апреля 2011

Однако вот проблема, которую я вижу в обоих этих решениях.Я использую базовые данные для своей объектной модели и в некоторых моих представлениях храню NSSet базовых данных.Проблема, с которой я столкнулся, заключается в том, что при сохранении объекта изменяется идентификатор объекта, что фактически делает недействительным все, что хранится в любом наборе NSSet, поскольку теперь isEqual и hash различаются.

tjg184,

Ваша проблема здесь не в переходе к постоянным идентификаторам, а в том, что ваш класс контейнера зависит от неизменяемого хэша.Следовательно, измените ваш контейнерный класс на массив или словарь, и эта проблема исчезнет.(Вы отказываетесь от уникальной работы с массивом, но с этим легко справиться, пройдя через переходный набор для выполнения уникальной работы.)

Эндрю

0 голосов
/ 09 апреля 2011

Возможным решением будет преобразование временных идентификаторов в постоянные с использованием [NSManagedObjectContext obtainPermanentIDsForObjects:error:].

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

0 голосов
/ 08 апреля 2011

Вы можете создать подкласс NSManagedObject и переопределить методы willSave и didSave, чтобы удалить, а затем повторно добавить ваши объекты в ваш набор.

Я фактически использовал другой подход - использование контекста NIL и предоставление базового класса для обработки вставки в контекст. Это работает очень хорошо и является самым чистым решением, которое я нашел. Код можно найти здесь ... Временные базовые данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...