2013-06-29 4 views
0

Я в процессе добавления основных данных в свое приложение для iPad. Моя общая процедура - проверить код, поместив его в делегат приложения. Когда я доволен, я правильно проанализировал код, переместив его в соответствующий метод в другом месте приложения. До сих пор это работало с добавлением объектов. Но у меня проблемы с удалением объектов. Я могу удалить их из делегата приложения, выбрав их и удалив их, и сейчас я удаляю их всех при запуске приложения, чтобы сохранить базу данных в чистоте, пока не будет работать основной код данных.Основные данные, удаляющие объекты

Достаточно моего рабочего процесса. Проблема, с которой я сейчас сталкиваюсь, - удалить объект из соответствующего места. Посмотрим, смогу ли я кратко описать свою установку.

У меня есть два класса, назовем их Car и Tire ради этой дискуссии. Я не знаю, что такое соглашение, поэтому я придумал свой собственный, а именно: добавить C_ в начало имени связанных объектов Core Data для хранения объектов, связанных с этими объектами. Поэтому у меня есть два дополнительных класса: C_Car и C_Tire. Каждый автомобиль может иметь несколько шин, поэтому Car имеет свойство tires, которое является NSSet от Tire *. Дополнительно Car имеет свойство CarCD типа C_Car *, а Tire имеет свойство TireCD типа C_Tire *, так что каждый объект может отслеживать связанный с ним объект данных ядра (CD для основных данных).

Xcode создает удобные методы для добавления или удаления объектов. Среди них - метод добавления шины к машине. Я использую, что таким образом:

tire.tireCD = tireCD; //tire is an object of type Tire *, and tireCD is an object of type C_Tire *. 
[self.carCD addTireObject:tireCD];//self.carCD is a property in my view controller of type CarCD *, and tireCD is a local object of type TireCD *. 

Кроме того, существует удобный метод для удаления шины от автомобиля, - (void)removeTireObject:(C_Tire *)value;. Я понял, что везде, на мой взгляд контроллер, где я был:

[tireObject removeFromSuperview];//tireObject is a (Tire *) object. 

я бы просто изменить, что:

[carObject removeTireObject:tireObject.tireCD]; 
[tireObject removeFromSuperview]; 

Первая строка должна удалить объект из NSSet на объекте ядра данных. Вторая строка удаляет объект из объекта автомобиля, используемого в приложении.

Проблема в том, что я не вижу, чтобы какой-либо SQL был сгенерирован в окне отладчика при выполнении этого кода. Я что-то упускаю?

Кроме того, если вы хотите прокомментировать соглашения об именах, сейчас пришло время принять все, что условно.

+0

Используя po для запроса объекта CarCD, я вижу, что удаление действительно происходит. Я считаю, что моя ошибка в том, что я не удалял объект TireCD, удаляя его только ссылку с объекта CarCD. –

+0

Я не понимаю, почему у вас есть 2 набора классов (Car/Tire и C_Car/C_Tire). Достаточно одного подкласса управляемого объекта для каждого объекта. –

+0

Не все свойства автомобиля и шины необходимо сохранить в основных данных. C_Care и C_Tire содержат только те свойства, которые необходимо сохранить. Другие свойства Car и Tire необходимы в приложении, но не в основных данных. Я надеюсь, что в этом есть смысл. –

ответ

1

(Это резюме с комментариями выше, плюс некоторые дополнительные замечания.)

  • [car removeTireObject:tire] только удаляет шины из автомобиля, он не удаляет объект шины. К удалить объект, позвоните по телефону [context deleteObject:tire].
  • Удаление шины автоматически удалит ее из соответствующего автомобиля, если для параметра «Удалить правило» для отношения с C_Tire к C_Car установлено значение «Nullify».
  • Изменения основных данных записываются только на диск, если контекст сохранен, только тогда вы будете см. Вывод отладки SQLite.

Для соглашений об именах см. "Conventions" в разделе «Программирование с помощью Objective-C». Некоторые замечания:

  • Использование подчеркивания в именах классов (как я думаю) необычно. Лучшими именами классов для классов управляемых объектов могут быть CDCar, CDTire или, если вы следуете предложению использовать трехбуквенный префикс, XYZCar, XYZTire, где XYZ - это префикс, выбранный вами.
  • Я бы использовал CarView, TireView для UIView подклассы.
Смежные вопросы