用于电子邮件问题的 NSPredicate predicateWithFormat

Posted

技术标签:

【中文标题】用于电子邮件问题的 NSPredicate predicateWithFormat【英文标题】:NSPredicate predicateWithFormat for email issue 【发布时间】:2015-12-30 06:33:31 【问题描述】:

我在使用 predicateWithFormat 方法创建 NSPredicate 类型对象时遇到问题。

AppDelegate *appdelegateObj = (AppDelegate *)[[UIApplication sharedApplication] delegate];

self.managedObjectContext = [appdelegateObj managedObjectContext];
NSString *emailWithBackslashedAtTheRate = [email stringByReplacingOccurrencesOfString:@"@" withString:@"\\@"];

NSFetchRequest *fetchRequestObj = [NSFetchRequest fetchRequestWithEntityName:@"Usertable"];
NSMutableArray *dataList;

**NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"email CONTAINS[c] %@",emailWithBackslashedAtTheRate]];**
[fetchRequestObj setPredicate:predicate];

@synchronized(delegate.persistentStoreCoordinator) 

    NSError *error = nil;
    NSMutableArray *filteredUser = (NSMutableArray *)[self.managedObjectContext executeFetchRequest:fetchRequestObj error:&error];

谁能解释一下,是什么问题?

【问题讨论】:

通过调用executeFetchRequest返回的error是什么? emailWithBackslashedAtTheRate 的格式是什么,您的实体中的 email 属性名称是什么? 你能记录下是什么问题吗? 无法解析格式字符串“(email=iostest1@gmail.com)” 【参考方案1】:

在您的用户表中,字段名称电子邮件必须是字符串。

 AppDelegate *coreAppDelegate=[[UIApplication sharedApplication]delegate];
        NSManagedObjectContext *context=[coreAppDelegate managedObjectContext];
        NSEntityDescription *entityDecs=[NSEntityDescription entityForName:@"UserDetail" inManagedObjectContext:context];
        NSFetchRequest *request =[[NSFetchRequest alloc]init];
        [request setEntity:entityDecs];
        //  NSLog(@"username = %@",mutarr);
        NSPredicate *pred=[NSPredicate predicateWithFormat:@"(email=%@)",TxtEmail];
        [request setPredicate:pred];
        NSManagedObject *matches =nil;
        NSError *error;

【讨论】:

【参考方案2】:

您不能使用NSString 方法stringWithFormat 来构建用于谓词的格式字符串。尽管名称相似,predicateWithFormatstringWithFormat 的工作方式不同。您应该将正确的格式字符串直接传递给predicateWithFormat:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"email CONTAINS[c] %@", email];

(此实例的主要区别在于predicateWithFormat 将由 %@ 表示的字符串括在单引号中,而stringWithFormat 没有。)

【讨论】:

以上是关于用于电子邮件问题的 NSPredicate predicateWithFormat的主要内容,如果未能解决你的问题,请参考以下文章

如何转义 NSPredicate 格式字符串中的尾部反斜杠

NSPredicate 用于评估字符串

NSPredicate 用于过滤数组

NSPredicate 用于多个对象和属性

NSPredicate 不适用于双值 (%f)?

NSPredicate 不适用于 ios 中的过滤