executefetchrequest 导致崩溃

Posted

技术标签:

【中文标题】executefetchrequest 导致崩溃【英文标题】:executefetchrequest causes crash 【发布时间】:2014-01-31 22:18:47 【问题描述】:

我正在尝试在 ios 7 应用程序中实现 Core Data(并且之前已成功实现)。但是,当我执行 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:清理(构建文件夹) “上下文”不为零 NSLog 打印出“文档创建/打开成功” 当应用崩溃时,控制台中只打印“lldb”

编辑: 在听从 Wain 的建议后,我关闭了异常断点,收到一条更具描述性的错误消息,指出谓词无效。通过将谓词中的 IN 替换为 CONTAINS 并更改变量“country”使其不再返回 nil 解决了问题。

【问题讨论】:

您是否尝试在遇到异常时继续尝试获取堆栈跟踪? 我不知道核心数据,但至少看起来该请求包含您期望的内容。 除了 Len 之外,控制台和调试器回溯中必须有更多。没有它就很难提供帮助。 【参考方案1】:

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

如果你使用字符串,你应该在谓词中使用CONTAINS

【讨论】:

谢谢。如您在上面的评论中建议的那样删除异常断点,表明谓词无效。我用CONTAINS替换了IN,但我也发现谓词(国家)中使用的变量为nil,导致崩溃。【参考方案2】:

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

【讨论】:

以上是关于executefetchrequest 导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Core Data - executeFetchRequest Swift 1.2 发布模式崩溃

NSPredicate,executeFetchRequest 崩溃

将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃

无法处理 executeFetchRequest 错误

coreData executeFetchRequest 方法的 Race Condition 导致 nil 数据的问题

executeFetchRequest 挂起并且从不返回错误或继续