2015-01-05 32 views
1

我正在更新Apple Watch的应用程序 此应用程序使用coredata,所以我创建了一个框架来管理Core Data堆栈! 当我运行在设备或模拟器的应用做工精细的应用程序,但是当我与此日志managedObjectModel in nil(仅适用于WatchApp)

***终止应用程序在苹果手表模拟器中运行的应用程序崩溃是由于未捕获的异常“NSInvalidArgumentException”,原因:

的问题似乎是managedObjectModel“不能用零模型创建 NSPersistentStoreCoordinator”,如果我登录它

NSLog(@"managedObjectModel %@", _managedObjectModel); 

日志重转

managedObjectModel(空)

在框架的代码似乎是正确的其实主要的应用程序完美的作品

反正这是框架

#import "DataAccess.h" 

@implementation DataAccess 

@synthesize managedObjectContext = _managedObjectContext; 
@synthesize managedObjectModel = _managedObjectModel; 
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; 


+ (instancetype)sharedInstance 
{ 
    static DataAccess *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[DataAccess alloc] init]; 
     // Do any other initialisation stuff here 
    }); 
    return sharedInstance; 
} 

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Replace this implementation with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 



#pragma mark - Core Data stack 

// Returns the managed object context for the application. 
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (_managedObjectContext != nil) { 
     return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     _managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return _managedObjectContext; 
} 

// Returns the managed object model for the application. 
// If the model doesn't already exist, it is created from the application's model. 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (_managedObjectModel != nil) { 

     NSLog(@"managedObjectModel %@", _managedObjectModel); 

     return _managedObjectModel; 

    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

    NSLog(@"managedObjectModel %@", _managedObjectModel); 


    return _managedObjectModel; 
} 

// Returns the persistent store coordinator for the application. 
// If the coordinator doesn't already exist, it is created and the application's store added to it. 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    //NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TMM.sqlite"]; 
    //NSURL *storeURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSAllDomainsMask] lastObject]; 
// storeURL = [storeURL URLByAppendingPathComponent:@"db.sqlite"]; 

    NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.ragazzetto.MyApp.Documents"]; 
    storeURL = [storeURL URLByAppendingPathComponent:@"MyApp.sqlite"]; 

    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _persistentStoreCoordinator; 
} 
#pragma mark - Application's Documents directory 

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 


@end 

的内容哪里有问题 ?

谢谢您的帮助

回答

4

当你写一个iOS应用extension--包括apps--你要创建一个单独的可执行文件与自己捆绑所有当前WatchKit。应用中的资源不一定在扩展中可用,反之亦然。所以,当你这样做:在WatchKit应用程序运行时,比它在你的应用程序包含

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"]; 
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

的URL是不同的。该错误告诉您WatchKit应用程序的URL无效,即WatchKit应用程序包中没有模型文件。

简单的解决方法是将模型包含在WatchKit包中。这样做的:

  1. 选择模型文件在Xcode
  2. 打开文件检查器面板上的Xcode的窗口
  3. 看右边“目标成员”部分。确保您的WatchKit目标已被选中。

这应该工作,但意味着你有两个模型文件的副本。更好的方法是将模型文件放入两个目标使用的共享框架中。这有点复杂,但有一点搜索会找到详细的步骤。

+0

谢谢汤姆的帮助! – Ragazzetto