Ios 包含的谓词导致的异常
我得到了一个奇怪的例外,我不知道如何找出这里出了什么问题Ios 包含的谓词导致的异常,ios,exception,core-data,Ios,Exception,Core Data,我得到了一个奇怪的例外,我不知道如何找出这里出了什么问题 "Serious application error. **Exception was caught during Core Data change processing.** This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. **Can't look for value (552284302
"Serious application error. **Exception was caught during Core Data change processing.** This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. **Can't look for value (552284302) in string (1070635162, 630076961, 690758344, 714304224, 693603903, 650263092, 552284302); value is not a string with userInfo (null)**"
我的代码如下:
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSManagedObjectContext *context = [ (MyAppDelegate*)[[UIApplication sharedApplication] delegate]managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"MyEntityName" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"distance" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
User *user = [[DatabaseHelper sharedInstance] getUserDetails];
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ AND recepientList contains %@", [NSNumber numberWithBool:YES], user.userId];
if(dootType == UnReadDootType){
predicteString = [predicteString stringByAppendingString:@" AND state = 'NEW' "];
}
NSPredicate *predicate;
if(senderId != nil && [senderId intValue] > 0){
predicteString = [predicteString stringByAppendingString:@" AND senderId == %@"];
predicate = [NSPredicate
predicateWithFormat:predicteString, senderId];
}else{
predicate = [NSPredicate
predicateWithFormat:predicteString];
}
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context sectionNameKeyPath:nil
cacheName:@"MyEntityName"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
[sort release];
[fetchRequest release];
[theFetchedResultsController release];
return _fetchedResultsController;
}
NSFetchRequest记录为:
<NSFetchRequest: 0x362350> (entity: MyEntityName; predicate: (isPrivate == 1 AND recepientList CONTAINS 552284302); sortDescriptors: ((
"(distance, ascending, compare:)"
)); batch size: 20; type: NSManagedObjectResultType; )
(isPrivate == 1 AND recepientList CONTAINS 552284302)
如你们所见,我使用了一个谓词,比如recepientList包含552284302
对于我的一条记录,recepientList中有1070635162、6300769078344、714304224、693603903、650263092、552284302。我正在recepientList中存储逗号分隔的userId,所以我不确定为什么会出现这种异常。user.userId被解析为数值而不是字符串。CONTAINS运算符不理解数值
记录为以下内容的谓词:
<NSFetchRequest: 0x362350> (entity: MyEntityName; predicate: (isPrivate == 1 AND recepientList CONTAINS 552284302); sortDescriptors: ((
"(distance, ascending, compare:)"
)); batch size: 20; type: NSManagedObjectResultType; )
(isPrivate == 1 AND recepientList CONTAINS 552284302)
…应记录为:
(isPrivate == 1 AND recepientList CONTAINS "552284302")
前一个谓词查找数值,而后一个谓词查找字符串。请注意,isPrivate==1中的数字未被引用
如果user.userID是一个NSNumber,那么获取它的字符串值应该可以解决这个问题。尝试:
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ AND recepientList contains %@", [NSNumber numberWithBool:YES], [user.userId stringValue]];
正在将user.userID解析为数值而不是字符串。CONTAINS运算符不理解数值
记录为以下内容的谓词:
<NSFetchRequest: 0x362350> (entity: MyEntityName; predicate: (isPrivate == 1 AND recepientList CONTAINS 552284302); sortDescriptors: ((
"(distance, ascending, compare:)"
)); batch size: 20; type: NSManagedObjectResultType; )
(isPrivate == 1 AND recepientList CONTAINS 552284302)
…应记录为:
(isPrivate == 1 AND recepientList CONTAINS "552284302")
前一个谓词查找数值,而后一个谓词查找字符串。请注意,isPrivate==1中的数字未被引用
如果user.userID是一个NSNumber,那么获取它的字符串值应该可以解决这个问题。尝试:
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ AND recepientList contains %@", [NSNumber numberWithBool:YES], [user.userId stringValue]];
多亏了@TechZen,他的回答给了我一个提示,让我找到了正确的答案 @TechZen您认为谓词应该作为
(isPrivate == 1 AND recepientList CONTAINS "552284302")
但问题是user.userId不是一个NSNumber,而是一个NSString,所以这行有问题
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ AND recepientList contains %@", [NSNumber numberWithBool:YES], user.userId];
我把这个改成了
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ ", [NSNumber numberWithBool:YES]];
predicteString = [predicteString stringByAppendingString:@"AND recepientList contains %@"];
predicate = [NSPredicate
predicateWithFormat:predicteString, user.fbUserId];
就这样,我得到了预期的结果。我不知道为什么NSString stringWithFormat将NSString视为NSNumber,而NSPredicate则以正确的方式处理它。多亏了@TechZen,他的回答给了我一个提示,让我找到了正确的答案 @TechZen您认为谓词应该作为
(isPrivate == 1 AND recepientList CONTAINS "552284302")
但问题是user.userId不是一个NSNumber,而是一个NSString,所以这行有问题
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ AND recepientList contains %@", [NSNumber numberWithBool:YES], user.userId];
我把这个改成了
NSString *predicteString = [NSString stringWithFormat:@"isPrivate == %@ ", [NSNumber numberWithBool:YES]];
predicteString = [predicteString stringByAppendingString:@"AND recepientList contains %@"];
predicate = [NSPredicate
predicateWithFormat:predicteString, user.fbUserId];
就这样,我得到了预期的结果。我不知道为什么NSString stringWithFormat将NSString视为NSNumber,而NSPredicate将其视为正确的方式。感谢TechZen的快速响应,user.userId是NSString,但它不是NSNumber,我不会每次都收到此错误,有时我会看到此错误,有时我不会,我可以告诉你,被记录的谓词把它当作一个数字。字符串应该是双引号或单引号。您可以使用带有recpientList键的字典数组来测试谓词。您将得到与上面相同的错误。这显然是谓词解析的问题。感谢TechZen的快速响应,user.userId只是NSString,而不是NSNumber,我不会每次都收到这个错误,有时我看到这个错误,有时我没有。好吧,我可以告诉你,日志中的谓词将它视为一个数字。字符串应该是双引号或单引号。您可以使用带有recpientList键的字典数组来测试谓词。您将得到与上面相同的错误。这显然是谓词解析的问题。