CoreData:过滤 FetchRequest 结果为零

Posted

技术标签:

【中文标题】CoreData:过滤 FetchRequest 结果为零【英文标题】:CoreData: Filtering a FetchRequest results are nil 【发布时间】:2012-07-16 12:01:03 【问题描述】:

我正在尝试过滤对 CD 的提取请求,最初它可以工作,但现在它返回一个空数组。我检查了实体(提供者)并且我尝试过滤的键名是正确的(提供者名称)。我检查了 SQLite 数据库,并且名称与我正在搜索的 providerName 匹配的记录在那里。 (见下面的附图)。有人可以查看我的代码,看看我是否做错了什么?谢谢:

- (NSArray* ) filterItemsFromCoreData : (NSArray* ) filters  

//create a managed object context
NSManagedObjectContext* context = [self managedObjectContext];

//create error container and fetch request
NSError* errMsg;
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];

//get our filters from passed array
NSString* filterProviderName = [filters objectAtIndex:0];
NSString* filterProviderZip = [filters objectAtIndex:1];
NSString* filterProviderPhone = [filters objectAtIndex:2];

//create predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"providerName == %@", filterProviderName];

//create entity description
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Provider" inManagedObjectContext:context];

//add entity and predicate to fetch request
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

//get the objects
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&errMsg];
NSLog(@"%@", fetchedObjects);
return fetchedObjects;

实体屏幕截图

SQLite 数据库

【问题讨论】:

你确定你使用的是同一个 managedObjectContext 吗?你应该在视图控制器之间传递 managedObjectContext 而不是创建一个新的......请提供 [self managedObjectContext] 的代码 艾哈迈德,感谢您的回复。这发生在 viewcontroller 中,mod 在这里创建,更多详细信息请参阅下面的回复。 您应该在 AppDelegate 中创建 managedObjectContext,然后在您需要从中访问它的任何类的 viewDidLoad 中执行这些 if (self.managedObjectContext == nil) self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 之一。 【参考方案1】:

将谓词格式中的格式说明符 %@ 更改为用单引号 '%@' 括起来。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"providerName == '%@'", filterProviderName];

这应该会再次返回结果。

【讨论】:

这个格式也是有效的 predicate = [NSPredicate predicateWithFormat:@"providerName = %@", filterProviderName]; 没有骰子。我仍然得到()。当我只对实体(没有 NSPredicate)运行请求时,它工作正常。

以上是关于CoreData:过滤 FetchRequest 结果为零的主要内容,如果未能解决你的问题,请参考以下文章

浅谈SwiftUI 3.0新加入的CoreData动态FetchRequest过滤与排序特性

根据日期和链接数据过滤 fetchRequest

另一种创建 NSPersistentHistoryChangeRequest.fetchRequest 过滤的方法

另一种创建 NSPersistentHistoryChangeRequest.fetchRequest 过滤的方法

CoreData事务记录查询(Query)中NSPersistentHistoryTransaction.fetchRequest总返回nil的解决

CoreData事务记录查询(Query)中NSPersistentHistoryTransaction.fetchRequest总返回nil的解决