Обновление предварительно загруженных данных вместе с пользовательскими данными в приложении Core Data

Простая задача, но для меня жесткое исполнение. Я работаю исключительно над приложением, которое находится в альфа-версии, но моим тестировщикам нужна самая последняя версия базы данных. У меня есть модель Core Data с двумя объектами: Clothing и ClothingRecord.

Одежда – это "статическая" модель с предварительно загруженными данными (такими как шляпа, рубашка, брюки и т. д.), которые будут меняться только при каждом обновлении модели.

ClothingRecord — это заполняемый пользователем объект, который связан с объектом Clothing.

введите здесь описание изображения

Я только что столкнулся с тем, что хочу изменить данные в Одежда. Не только изменить свойства одежды (например, изменить имя с «Шляпа» на «Кепка»), но я также хочу добавлять и удалять элементы.

Я новичок в Core Data, поэтому я использовал учебник Рэя Вендерлиха о том, как предварительно загружать данные: http://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing.-data

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

Существуют ли руководства или руководства по обновлению приложения, управляемого Core Data, с предварительно загруженными данными? Я бы предположил, что это происходит все время, но я не могу найти никаких надежных ресурсов по этому поводу.


person rnystrom    schedule 02.06.2012    source источник
comment
Я добавил правку. Может быть, может быть интересен для вас.   -  person Lorenzo B    schedule 02.06.2012


Ответы (1)


Обхожу ли я все объекты и сравниваю? Я просто добавляю новые вещи? Я не могу пойти и удалить объекты из-за существующих отношений, верно?

По-разному. Я постараюсь дать вам несколько предложений.

Пройтись по всем объектам и сравнить?

Чтобы просмотреть и сравнить, сначала я вставлю атрибут, который работает как идентификатор (например, guid ). Наличие идентификатора может позволить вам сравнивать объекты, которые вы извлекаете с помощью Core Data. Например, если у «Шляпы» есть guid с 1234, а у «Cap» такой же guid, вы можете просто получить идентификатор и обновить этот объект с новым именем. Этого можно добиться, настроив NSPredicate (how-to-update -существующий-объект-в-базе-данных).

Я просто добавляю что-то новое?

Вы можете сделать это, если у вас нет отношений со второй сущностью. Напротив, вам нужно связать новый объект с исходными отношениями.

Я не могу пойти и удалить объекты из-за существующих отношений

Как и раньше, вам нужно заново создать эти отношения, а затем удалить интересующие вас объекты.

Я попробую первое решение, если вы только начали с CD. Я также предлагаю старый ответ, который я написал в предыдущем сообщении SO о Core Data в целом (сопоставление-бизнес-объектов-с-основными-данными-в-ios).

Надеюсь, поможет.

Изменить

Что касается последних двух вариантов, вы можете выполнить двухэтапную операцию.

Сначала создайте запрос, который позволит вам получить предварительно заполненные Clothing объекты.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Clothing" inManagedObjectContext:moc]];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];

Массив results содержит извлеченные объекты, теперь с помощью for-loop создайте новый объект и установите правильные отношения.

for(Clothing* clothing in results) {

    Clothing* newClothing = [NSEntityDescription insertNewObjectForEntityForName:@"Clothing" inManagedObjectContext:moc];
    newClothing.name = @"Cap";
    newClothing.relationshipToWhatYouWant = clothing.relationshipToWhatYouWant;
}

Наконец, если хотите, удалите старые объекты.

P.S. Проверьте код, потому что я написал от руки.

person Lorenzo B    schedule 02.06.2012