【问题标题】:Exception Caused by Predicate with CONTAINS由带有 CONTAINS 的谓词引起的异常
【发布时间】:2011-11-19 17:17:10
【问题描述】:

我遇到了这个奇怪的异常,我不知道如何找出这里出了什么问题

"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; )

如您所见,我使用了recepientList CONTAINS 552284302 之类的谓词 对于我的记录之一,recepientList 有 1070635162, 630076961, 690758344, 714304224, 693603903, 650263092, 552284302 我将逗号分隔的 userId 存储在 recepientList 中,所以我不确定为什么会出现这个异常。

【问题讨论】:

    标签: ios exception core-data


    【解决方案1】:

    user.userID 被解析为数值而不是字符串。 CONTAINS 运算符不理解数值。

    记录为的谓词:

    (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 的快速响应,user.userId 是 NSString,只是它不是 NSNumber,而且我每次都不会收到此错误,有时我会看到此错误,有时我不会.
    • 好吧,我可以告诉你,记录的谓词将其视为一个数字。字符串应该是双引号或单引号。您可以使用带有recpientList 键的字典数组来测试谓词。您将收到与上述相同的错误。这显然是谓词解析的问题。
    【解决方案2】:

    感谢@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 以正确的方式对待它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-06
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多