2014-05-29 2 views
1

Надеюсь, вы сможете помочь.CoreData в новом проекте

У меня есть приложение iOS, которое было создано 3 года назад с помощью CoreData. Появилась возможность внести некоторые существенные обновления, и было проще просто начать новый проект Xcode, продолжая использовать существующий идентификатор пакета, чтобы приложение оставалось фактическим обновлением для пользователей iTune.

Мой вопрос: создает ли новый проект в Xcode и вручную создает репликацию модели/объекта/атрибутов из первой версии, чтобы данные не были доступны в новом проекте?

У меня есть быстрый код в первой версии приложения, который просто возвращает количество записей в данных (см. Ниже), но когда тот же код используется в новом проекте, он ничего не возвращает, как будто в приложении нет данных. iCloud также использовался в первой версии.

Я думал, что если бы у меня была установлена ​​первая версия приложения, была создана несколько записей, а затем установлена ​​новая версия, данные все равно будут доступны.

Я не понял, как работает миграция с CoreData, и мне лучше получить старый проект, рефакторинг для ARC и ручное перемещение по новому коду, чтобы исходная сущность все еще использовалась?

Любые советы будут оценены.

NSFileManager *fileManager = [NSFileManager defaultManager]; 

NSString *entityName = @"MyObjects"; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"row_id" 
                       ascending:YES 
                        selector:@selector(localizedCaseInsensitiveCompare:)]]; 

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyObjects" withExtension:@"mom"]; 

NSManagedObjectModel *managedObject = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

NSString *iCloudEnabledAppID = @"com.xxxx.myobjects"; 
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObject]; 
NSString *dataFileName = @"MyObjects.sql"; 

NSString *iCloudDataDirectoryName = @"Data.nosync"; 
NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil]; 

NSString *iCloudData = [[[iCloud path] 
         stringByAppendingPathComponent:iCloudDataDirectoryName] 
         stringByAppendingPathComponent:dataFileName]; 

NSMutableDictionary *options = [NSMutableDictionary dictionary]; 
[options setObject:iCloudEnabledAppID   forKey:NSPersistentStoreUbiquitousContentNameKey]; 

[coordinator lock]; 

[coordinator addPersistentStoreWithType:NSSQLiteStoreType 
        configuration:nil 
          URL:[NSURL fileURLWithPath:iCloudData] 
         options:options 
          error:nil]; 

[coordinator unlock]; 

NSManagedObjectContext *moc = nil; 
if (coordinator != nil) { 
    moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    [moc setPersistentStoreCoordinator: coordinator]; 
} 

NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                    managedObjectContext:moc 
                     sectionNameKeyPath:nil 
                       cacheName:nil]; 
[fetchedResultsController performFetch:nil]; 

NSLog(@">>>>>> %@", [fetchedResultsController fetchedObjects]); // returns 2 records 

ответ

1

Во-первых, я не уверен, почему вы отметили это с помощью MagicalRecord. Ваш образец кода - это все исходные данные ядра.

Во-вторых, если бы я был вами, я бы взял существующий файл модели из старого приложения и сделал первую версию модели данных в новом приложении. You может воссоздать модель данных с атрибутами и сущностями и т. Д. И, в конечном итоге, с теми же хэшами версий, но вам не нужно проходить эту проблему, если у вас уже есть исходная точка. Просто начните с существующей модели данных и продвигайтесь вперед. Xcode и Core Data не привязывают файлы модели данных к проектам Xcode, и у вас нет блокировки таким образом. Файлы управляемой объектной модели - это только текстовые файлы, такие как все остальные коды вашего приложения.

В-третьих, установка iCloud требует гораздо меньше кода в iOS7. Это довольно просто, так как команда Core Data решила позаботиться обо всех работах по установке и резервному обслуживанию. Я предлагаю взглянуть на «Что нового в Core Data» из WWDC2013.

И, наконец, вы убедились, что на самом деле вы дублировали модель с существующим магазином? Если у вас есть модель, не совместимая с хранилищем, в вашем стеке основных данных не будет привязано постоянное хранилище. То есть с верхнего уровня (ваш NSManagedObjectContext) он будет инициализирован, но подключенный NSPsistentStoreCoordinator не будет иметь никаких магазинов. Без сохранения данных данные не будут сохранены, и данные не будут загружены. Версия управляемой объектной модели ДОЛЖНА соответствовать информации о версии в файле хранилища.Вы можете проверить это самостоятельно с вызовами:

-[NSPersistentStoreCoordinator metadataForPersistentStore:] 

или

+[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:URL:error:] 

в сочетании с

-[NSManagedObjectModel isConfiguration:compatibleWithStoreMetadata:] 

Вы также упомянуть миграции. Если у вас не более одной модели данных, вы фактически не переносите свои данные. Но когда у вас есть версии для переноса, вам также нужно будет установить параметры миграции для облегченных миграций (автоматические миграции), чтобы действовать, когда вы прикрепляете хранилище к координатору. Я предлагаю прочитать за Apple Documentation on Versioning and Migration.

+0

Я бы добавил, что при условии доступа к старому проекту. Вероятно, вы сможете получить фактическое постоянное хранилище, которое использовалось в дистрибутиве (или, по крайней мере, близкое приближение), в противном случае OP будет пересобирать данные, даже если сантехника будет правильной. –

+0

Спасибо, что ребята. Я попытался взять модель данных из старого приложения и сразу же разместить его в новом приложении, не успев опубликовать этот пост, но не имел большой удачи. Я проверю, чтобы мой постоянный магазин был также дублирован. Извинения за теги MagicalRecord. У меня есть MagicalRecord в проекте, но в последние несколько дней, пытаясь обойти его, я сократил его, чтобы попытаться сохранить код «сырым», просто чтобы исключить MagicalRecord в качестве причины. Еще раз спасибо. – roycable

Смежные вопросы