【发布时间】:2014-05-29 11:23:08
【问题描述】:
希望您能提供帮助。
我有一个 3 年前使用 CoreData 构建的 iOS 应用。进行一些重大更新的机会出现了,人们认为在继续使用现有捆绑标识符的同时简单地启动一个新的 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
【问题讨论】:
标签: ios objective-c core-data