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

嵌套对象 IOS 的 NSPredicate 问题

如何使用 NSPredicate 在字符串中查找开头的单词?

在目标 c 中使用 nspredicate 时如何解决空间问题?