核心数据获取请求中需要谓词?
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]];
【讨论】:
以上是关于核心数据获取请求中需要谓词?的主要内容,如果未能解决你的问题,请参考以下文章