2015-01-05 4 views
1

Я обновляю приложение для Apple Watch Это приложение использует coredata, поэтому я создал фреймворк для управления стекю Core Data! Когда я запустить приложение на устройстве или тренажере приложение работает отлично, но когда я запустить его на яблоко часов тренажера аварию приложения с этим журналомmanagedObjectModel in nil (только в WatchApp)

*** Нагрузочным приложением из-за неперехваченное исключение «NSInvalidArgumentException», почему-то : «Невозможно создать NSPersistentStoreCoordinator с нулевой моделью»

проблема, казалось бы, быть managedObjectModel и если я его войти

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

Когда вы пишете приложение extension-- IOS, включая весь текущий WatchKit apps-- вы создаете отдельный исполняемый файл со своим собственным пучком. Ресурсы в приложении не обязательно доступны в расширении, и наоборот. Так что, когда вы это делаете:

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

URL-адрес отличается при работе в приложении WatchKit, чем в вашем содержащем приложении. Ошибка сообщает вам, что URL-адрес приложения WatchKit недействителен, т. Е. Нет файла модели в комплекте приложения WatchKit.

Простым решением является просто включить модель в комплект поставки WatchKit. Сделайте это:

  1. Выбор файла модели в Xcode
  2. Открытие панели файла инспектор по правой стороне окна Xcode
  3. Смотри в разделе «членство цель». Убедитесь, что выбрана цель WatchKit.

Это должно работать, но это означает, что у вас есть две копии файла модели. Лучшим подходом было бы поставить файл модели в общую структуру, используемую обеими целевыми объектами. Это немного сложнее, но небольшой поиск найдет подробные шаги.

+0

Спасибо Том за вашу помощь! – Ragazzetto