【问题标题】:iphone- core data error 'NSInvalidArgumentException', reason: 'Unimplemented SQL generation for predicate'iphone-核心数据错误“NSInvalidArgumentException”,原因:“未实现的谓词 SQL 生成”
【发布时间】:2012-06-02 13:42:15
【问题描述】:

我是 iphone 开发新手。我正在尝试使用 iphone 核心数据存储一些数据。当我尝试保存时,我收到了类似的错误。

Detected an attempt to call a symbol in system libraries that is not present on the         
_Unwind_Resume called from function -[NSSQLAdapter    
 _newSelectStatementWithFetchRequest:ignoreInheritance:] in image CoreData.

2012-05-28 12:05:38.179 FYPV1[6460:207] *** Terminating app due to uncaught exception
 'NSInvalidArgumentException', reason: 'Unimplemented SQL generation for predicate 
(surname MATCHES $search_surname)'
*** Call stack at first throw:
(
0   CoreFoundation                      0x02668b99 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x027b840e objc_exception_throw + 47
2   CoreData                            0x0003be86 -[NSSQLGenerator generateSQLStatementForFetchRequest:ignoreInheritance:countOnly:] + 1254
3   CoreData                            0x0003b6f0 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 480
4   CoreData                            0x0003b501 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49
5   CoreData                            0x0003b3ae -[NSSQLCore newRowsForFetchPlan:] + 430
6   CoreData                            0x0003ab09 -[NSSQLCore objectsForFetchRequest:inContext:] + 297
7   CoreData                            0x0003a6fe -[NSSQLCore executeRequest:withContext:error:] + 206
8   CoreData                            0x000e891c -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1084
9   CoreData                            0x00037897 -[NSManagedObjectContext executeFetchRequest:error:] + 359
10  FYPV1                               0x0000715f -[Contacts saveContacts:] + 367
11  UIKit                               0x001fc7f8 -[UIApplication sendAction:to:from:forEvent:] + 119
12  UIKit                               0x00287de0 -[UIControl sendAction:to:forEvent:] + 67
13  UIKit                               0x0028a262 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
14  UIKit                               0x00288e0f -[UIControl touchesEnded:withEvent:] + 458
15  UIKit                               0x002203d0 -[UIWindow _sendTouchesForEvent:] + 567
16  UIKit                               0x00201cb4 -[UIApplication sendEvent:] + 447
17  UIKit                               0x002069bf _UIApplicationHandleEvent + 7672
18  GraphicsServices                    0x02f48822 PurpleEventCallback + 1550
19  CoreFoundation                      0x02649ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
20  CoreFoundation                      0x025aa807 __CFRunLoopDoSource1 + 215
21  CoreFoundation                      0x025a7a93 __CFRunLoopRun + 979
22  CoreFoundation                      0x025a7350 CFRunLoopRunSpecific + 208
23  CoreFoundation                      0x025a7271 CFRunLoopRunInMode + 97
24  GraphicsServices                    0x02f4700c GSEventRunModal + 217
25  GraphicsServices                    0x02f470d1 GSEventRun + 115
26  UIKit                               0x0020aaf2 UIApplicationMain + 1160
27  FYPV1                               0x00001e59 main + 121
28  FYPV1                               0x00001dd5 start + 53
)
terminate called after throwing an instance of 'NSException'

如何解决这个问题。

这是我保存数据的代码。

   NSError *error;  

    NSDictionary *subs = [NSDictionary 
                          dictionaryWithObjectsAndKeys:fetchContact.first_name, @"search_firstname",fetchContact.surname,@"search_surname", nil];

    NSFetchRequest *fetchRequestCheckNil = 
    [managedObjectModel fetchRequestFromTemplateWithName:
     @"Fetchaddcontact" substitutionVariables:subs];

    NSArray *fetchedObjects=[context executeFetchRequest:fetchRequestCheckNil error:nil];
    if ([fetchedObjects count]>0) {
        for (ENTITYADDCONTACTS *contactDetails
             in fetchedObjects) {

            [self updateDBModel:contactDetails];
        }
    }
else {   
    ENTITYADDCONTACTS *contactDetails;
    contactDetails = [NSEntityDescription
                      insertNewObjectForEntityForName:@"ENTITYADDCONTACTS" 
                      inManagedObjectContext:context]; 
    [self updateDBModel:contactDetails];
    }

if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

【问题讨论】:

    标签: iphone sqlite core-data nsfetchrequest


    【解决方案1】:

    根据Predicate Programming Guide 约束和限制部分,您不能将 MATCHES 关键字与 sqlite 持久存储一起使用。

    引用:

    matches 运算符使用正则表达式,因此 Core Data 的 SQL 存储不支持 - 尽管它确实适用于内存过滤。

    在您的情况下,我会使用 BEGINSWITH 或 LIKE。请注意,BEGINSWITH 具有性能优势,因此我建议尽可能使用它。

    以下是可用的字符串谓词比较:

    默认情况下,字符串比较区分大小写和变音符号。您可以使用方括号中的关键字符 c 和 d 来修改运算符,以分别指定不区分大小写和变音符号,例如 firstName BEGINSWITH[cd] $FIRST_NAME。

    开始

    左边的表达式以右边的表达式开头。

    包含

    左边的表达式包含右边的表达式。

    ENDSWITH

    左边的表达式以右边的表达式结束。

    喜欢

    左边的表达式等于右边的表达式: ?和 * 允许作为通配符,在哪里?匹配 1 个字符, * 匹配 0 个或更多字符。在 Mac OS X v10.4 中,通配符与换行符不匹配。

    比赛

    根据 ICU v3,左侧表达式使用正则表达式样式比较等于右侧表达式(有关更多详细信息,请参阅 ICU 正则表达式用户指南)。

    这里的例外是 MATCHES,正如我之前所说,它不能与 sqlite 持久存储一起使用。除此之外,您还可以使用纯 == 进行严格的相等比较。

    【讨论】:

    • 如果我使用 IS。有什么问题吗。
    • 更新了我的答案以反映您上面的问题。
    • 为了调试方便,请您尝试使用 predicateWithFormat: 做同样的事情,而不使用存储在模型中的获取请求模板?
    • 你说你用 == 试过了。以前的原因是:“未实现谓词的 SQL 生成(姓氏 MATCHES $search_surname)”。现在的确切错误是什么?您尝试了我的建议还是设法解决了?
    • 我在"%@ BEGINSWITH columnName", someLargerString 格式的谓词中遇到了与BEGINSWITH 相同的异常。对这种情况有什么建议(与更频繁的用例相比,这两个参数是相反的)?
    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多