我正在开发一个需要使用Core Data的应用程序,我不禁注意到,除了Master-Detail,Utility或Blank模板之外,还必须手动放入Core Data在Xcode中。
我还注意到,为了让Core Data正常工作,您必须将您的应用程序包装在AppDelegate文件中的导航控制器和Core Data的代码中。
任何人都知道如何解决这个问题,或者这是应该采用的方式?
My App Delegate看起来像这样,这三行似乎是ManagedObjectContext最重要的设置!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
FBBetsViewController *controller = (FBBetsViewController *)navController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
答案 0 :(得分:3)
这些模板包括一些核心数据设置,但它远非强制性。您可以在任何项目中使用核心数据。如果需要,您可以从空应用程序中获取代码,并在项目中使用它。
如果查看生成的代码,您将看到用于构建核心数据堆栈的三个主要组件的三个“getter”。
managedObjectModel通过使用捆绑包中的模型文件来创建模型。通过New-File在Xcode中轻松创建并选择核心数据数据模型。
persistentStoreCoordinator使用模型和SQL存储。
最后,使用persistentStoreCoordinator创建managedObjectContext。注意,如果需要,您真的可以在一个方法中构建该堆栈。没有要求拥有这些个人访问者......
你可以这样做......
- (NSManagedObjectContext*)setupCoreDataStack
{
// Load the model description
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"APPNAME" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// Prepare the persistent store coordinator - needs the model
NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"APPNAME.sqlite"];
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
{
// Handle the error !!!!!
// exit the function
return nil;
}
// Create the managed object context. This is what you will really
// use in the rest of your program.
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
return moc;
}
现在你的筹码几乎与其他筹码差不多。唯一真正的区别是这里的MOC使用的是主队列并发类型,这是一个更好的选择。
如果您想拥有更好的性能模型,请插入父moc。
实际上,如果您没有与当前的核心数据策略结婚,我建议使用UIManagedDocument。
答案 1 :(得分:2)
Core Data并未强制您使用导航控制器,也未将其设置在AppDelegate中。通常在启动时将设置放在AppDelegate中,但实际上,只要确保它只初始化一次,就可以将它移动到任何地方。