Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios executefetchrequest导致崩溃_Ios_Objective C_Core Data_Executefetchrequest - Fatal编程技术网

Ios executefetchrequest导致崩溃

Ios executefetchrequest导致崩溃,ios,objective-c,core-data,executefetchrequest,Ios,Objective C,Core Data,Executefetchrequest,我正在尝试在iOS 7应用程序中实现核心数据(之前已经成功实现)。但是,当我执行executeFetchRequest方法时,应用程序崩溃。下面添加了最相关的代码: #import "JTHuntingSeasonDB.h" @implementation JTHuntingSeasonDB - (id)init { self = [super init]; if (self) { NSFileManager *fileManager = [NSFileMan

我正在尝试在iOS 7应用程序中实现核心数据(之前已经成功实现)。但是,当我执行executeFetchRequest方法时,应用程序崩溃。下面添加了最相关的代码:

#import "JTHuntingSeasonDB.h"

@implementation JTHuntingSeasonDB

- (id)init {
    self = [super init];
    if (self) {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];

        NSString *documentName = @"JTHuntingDB";
        NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];

        document = [[UIManagedDocument alloc] initWithFileURL:url];


        BOOL fileExists  = [[NSFileManager defaultManager] fileExistsAtPath:[url path]];

        if (fileExists) {
            [document openWithCompletionHandler:^(BOOL success) {
                if (success) {
                    NSLog(@"Document opened successfully");
                    self.allSpecies = [self getSpecies];
                    self.speciesToday = [self getSpeciesToday];
                } else NSLog(@"Failed to open document");
            }];
        } else {
            [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
                if (success)  {
                    NSLog(@"Document created successfully");
                    self.allSpecies = [self getSpecies];
                    self.speciesToday = [self getSpeciesToday];
                }  else NSLog(@"Failed to create document, path: %@", url);
            }];
        }
    }

    return self;
}

#pragma mark - Core Data

- (NSArray *)getSpecies {
    if (document.documentState == UIDocumentStateNormal) {
        context = document.managedObjectContext;

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *country = [defaults stringForKey:@"Country"];
        NSString *subregion = [defaults stringForKey:@"Subregion"];

        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"HuntingDates"];
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedStandardCompare:)];
        request.fetchBatchSize = 150;
        request.fetchLimit = 150;
        request.sortDescriptors = @[sortDescriptor];

        if (subregion.length > 0) {
            request.predicate = [NSPredicate predicateWithFormat:@"(country IN %@) AND (subregion IN %@)", country, subregion];
        } else {
            request.predicate = [NSPredicate predicateWithFormat:@"country IN %@", country];
        }

        NSError *error;
        return [context executeFetchRequest:request error:&error];
    }

    return nil;
}
线路

return [context executeFetchRequest:request error:&error];
导致应用程序崩溃。这就是我迄今为止所做和发现的:

  • 模拟器:删除应用程序并重置内容和设置
  • Xcode:Clean(生成文件夹)
  • “上下文”不是零
  • NSLog打印出“文档创建/打开成功”
  • 当应用程序崩溃时,控制台中只打印“lldb”
编辑:
遵循Wain的建议后,我关闭了异常断点,得到了一条更具描述性的错误消息,指出谓词无效。通过将谓词中的IN替换为CONTAINS并更改变量“country”,使其不再返回nil,问题得以解决。

我想这是您的谓词,因为
IN
是一个集合运算符,但您正在传递字符串(应该是数组/集合)


如果您使用的是字符串,那么应该在谓词中使用
CONTAINS

假设CoreData持久存储存在于文档中,您将需要使用UIManagedDocument

是否在异常发生时尝试继续以获取堆栈跟踪?我不知道核心数据,但至少会看到请求包含您期望的内容。除了Len,控制台和调试器回溯中还必须有更多内容。没有这一点就很难帮上忙。谢谢。按照上面注释中的建议删除异常断点,表明谓词无效。我将IN替换为CONTAINS,但我还发现谓词(country)中使用的变量是nil,这导致了崩溃。