ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?
Posted
技术标签:
【中文标题】ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?【英文标题】:ios How to properly use NSPredicate for NSString matching with Core Data? 【发布时间】:2012-07-20 14:40:44 【问题描述】:我正在尝试使用以下代码将实体插入或更新(如果存在)到 Core Data:
- (void)insertFriendWithDictionary:(NSDictionary *)friendInfo
NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Friend"];
NSString *atributeName = @"identifier";
NSString *valueName = [[friendInfo objectForKey:@"id"] stringFromMD5];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",atributeName,valueName ];
req.predicate = predicate;
req.fetchLimit = 1;
NSError *requestError = nil;
NSArray *tmp = [self.managedObjectContext executeFetchRequest:req error:&requestError];
if (tmp && tmp.count >0)
Friend *friend = [tmp objectAtIndex:0];
friend.name = [friendInfo objectForKey:@"name"];
friend.identifier = [NSString stringWithFormat:@"%@",[[friendInfo objectForKey:@"id"] stringFromMD5]];
[self saveContext];
return;
Friend *friend =
[NSEntityDescription insertNewObjectForEntityForName:@"Friend"
inManagedObjectContext:self.managedObjectContext];
friend.name = [friendInfo objectForKey:@"name"];
friend.identifier = [friendInfo objectForKey:@"id"];
friend.noOfMessagesReceived = [NSNumber numberWithInt:0];
friend.email = @"";
friend.selected = [NSNumber numberWithBool:NO];
friend.frooiFriend = [NSNumber numberWithBool:NO];
但第二次运行代码时谓词不匹配任何结果。我相信这是 NSPredicate 的问题。
这是为朋友生成的代码:
@interface Friend : NSManagedObject
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSNumber * frooiFriend;
@property (nonatomic, retain) NSString * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * noOfMessagesReceived;
@property (nonatomic, retain) NSData * profileImage;
@property (nonatomic, retain) NSNumber * selected;
@property (nonatomic, retain) NSNumber * frooliMessagesSentTo;
@end
我做错了吗?
谢谢
【问题讨论】:
似乎首先执行请求然后插入对象,因此在第一次运行后,您在空数据结构上执行请求(结果是0
,这是正确的)然后插入一个新的NSManagedObject
,现在结果将是1
,但您没有请求当前数据库。尝试先插入新的NSManagedObject
,然后执行请求。你怎么看?
我认为我使用的逻辑很好。蒂洛指出了问题
【参考方案1】:
[friendInfo objectForKey:@"id"]
是否等于 [[friendInfo objectForKey:@"id"] stringFromMD5]
?
如果不是:这是您的问题,因为您正在为新朋友设置 friend.identifier = [friendInfo objectForKey:@"id"];
,但搜索朋友的谓词使用 [[friendInfo objectForKey:@"id"] stringFromMD5]
。
【讨论】:
【参考方案2】:尝试使用这个谓词:
[NSPredicate predicateWithFormat:@"%@ MATCHES[cd] '.*%@.*'",atributeName,valueName ];
这不是最好的性能,但它确实有效。之后您可以提高性能。
【讨论】:
以上是关于ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?
iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?
我如何在单个提取请求中调用两个 NSPredicate。核心数据 iOS Swift