首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >managedObjectModel以零表示(仅在WatchApp中)

managedObjectModel以零表示(仅在WatchApp中)
EN

Stack Overflow用户
提问于 2015-01-05 16:47:45
回答 1查看 992关注 0票数 1

我正在为Apple Watch更新一个应用程序,这个应用程序使用coredata,所以我创建了一个框架来管理核心数据栈!当我在设备或模拟器上运行应用程序时,应用程序运行良好,但当我在苹果手表模拟器上运行应用程序时,应用程序就会崩溃。

*终止应用程序由于非正常异常“NSInvalidArgumentException”,原因:“无法创建具有零模型的NSPersistentStoreCoordinator”

问题似乎是managedObjectModel,如果我把它记录下来

代码语言:javascript
复制
NSLog(@"managedObjectModel %@", _managedObjectModel);

日志返回

managedObjectModel (null)

框架中的代码看起来是正确的,事实上,主应用程序运行得很完美。

总之,这是框架的内容。

代码语言:javascript
复制
#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

问题出在哪里?

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 17:54:50

当您编写iOS应用程序扩展时--包括所有当前的WatchKit应用程序--您将创建一个单独的可执行文件,并附带它自己的包。应用程序中的资源不一定在扩展中可用,反之亦然。所以当你这么做的时候

代码语言:javascript
复制
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

在WatchKit应用程序中运行的URL不同于在包含的应用程序中运行的URL。错误告诉您,WatchKit应用程序的URL无效,即WatchKit应用程序的包中没有模型文件。

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

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

这应该可以工作,但将意味着您有两个副本的模型文件。更好的方法是将模型文件放入两个目标都使用的共享框架中。这有点复杂,但只要稍加搜索,就会发现详细的步骤。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27784069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档