核心数据获取请求中需要谓词?

Posted

技术标签:

【中文标题】核心数据获取请求中需要谓词?【英文标题】:Predicate required in Core Data fetch request? 【发布时间】:2012-04-24 09:03:10 【问题描述】:

我想省略 NSFetchRequest 中的谓词,以便删除实体的所有托管对象。

但是,当没有谓词时(根据 SQL 调试器),不会执行 fetch 请求。根据 Apple 的说法,谓词应该是可选的。

我需要如何更改代码以删除谓词?有任何想法吗?谢谢!

- (void)deleteEntity:(NSString*)entityName inContext:(NSManagedObjectContext *)context
      
        NSFetchRequest * request= [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"TableStructure" inManagedObjectContext:context]];
        //[entities setIncludesPropertyValues:NO]; //only fetch the managedObjectID
        NSPredicate * predicate = [NSPredicate predicateWithFormat:@"category = 'est'"];
        [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *entitiesArray = [context executeFetchRequest:request error:&error];

    if (error) 
        NSLog(@"%@: Error fetching context: %@", [self class], [error localizedDescription]);
        NSLog(@"entitiesArray: %@",entitiesArray);
        return;
    

    for(NSManagedObject *entity in entitiesArray) 
        [context deleteObject:entity];
    

    NSError *saveError = nil;
    [context save:&saveError];

更新 2

似乎我在数据库准备好之前调用了我的 fetch 请求。如何确保在核心数据数据库准备好之前不调用我的请求?

【问题讨论】:

会发生什么?您收到错误消息吗?它会默默地失败吗? Stephen,请求返回一个空的 NSArray (count = 0)。在调试器窗口中检查 SQL 代码时,当谓词被省略时,我看不到任何 SQL 命令。但是,当包含谓词时,请求运行良好。 检查你是否调用了你的 managedObjectContext: 方法为你的“上下文”值这样的 NSManagedObjectContext *context = [AppDelegate managedObjectContext]; R.A.我已经更新了我的问题... 【参考方案1】:

如果您不想要谓词,则根本不分配它。删除以下行:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"category = 'est'"];
[request setPredicate:predicate];

【讨论】:

当我删除这些行时,我的代码不起作用(如我上面的评论中所述)。 我一直这样做并得到我的结果,在执行请求之前检查您的数据库是否有 TableStructure 实体。你可以试试:request.predicate = nil; 您仍然没有任何关于它何时崩溃的调试信息?仅使用数组计数为 0 的信息很难看出有什么问题。我猜你的 NSManagedObjectContext 有问题,只要检查它是否创建正确并且没有被破坏。 看来我调用了我的获取请求之前数据库准备好了,我已经通过NSLog语句验证了。 你搞砸的越多,你在调试中的表现就越好 :-)【参考方案2】:

我在 Core Data 数据库准备好之前发出了我的 fetch 请求。

为了解决这个问题,我现在将调用 ImportFormulasInRequest 添加到 UIDocument openWithCompletion 处理程序,它封装了我的核心数据数据库:

- (void)useDocument

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.myDatabase.fileURL path]]) 
        // does not exist on disk, so create it
        [self.myDatabase saveToURL:self.myDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) 
            [self setupFetchedResultsController];
        ];
     else if (self.myDatabase.documentState == UIDocumentStateClosed) 
        // exists on disk, but we need to open it
        [self.myDatabase openWithCompletionHandler:^(BOOL success) 
            [self setupFetchedResultsController];
            [self ImportFormulasInContext:[self.myDatabase managedObjectContext]];
        ];
     else if (self.myDatabase.documentState == UIDocumentStateNormal) 
        // already open and ready to use
        [self setupFetchedResultsController];
        [self ImportFormulasInContext:[self.myDatabase managedObjectContext]];
    

【讨论】:

以上是关于核心数据获取请求中需要谓词?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据获取请求关系属性谓词

获取复杂请求核心数据的谓词和表达式

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

带有数组的核心数据获取请求

获取请求中的一些奇怪结果 - 核心数据

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)