Надеюсь, вы сможете помочь.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
Я бы добавил, что при условии доступа к старому проекту. Вероятно, вы сможете получить фактическое постоянное хранилище, которое использовалось в дистрибутиве (или, по крайней мере, близкое приближение), в противном случае OP будет пересобирать данные, даже если сантехника будет правильной. –
Спасибо, что ребята. Я попытался взять модель данных из старого приложения и сразу же разместить его в новом приложении, не успев опубликовать этот пост, но не имел большой удачи. Я проверю, чтобы мой постоянный магазин был также дублирован. Извинения за теги MagicalRecord. У меня есть MagicalRecord в проекте, но в последние несколько дней, пытаясь обойти его, я сократил его, чтобы попытаться сохранить код «сырым», просто чтобы исключить MagicalRecord в качестве причины. Еще раз спасибо. – roycable