sachi
sachi

Reputation: 2132

iphone- core data error 'NSInvalidArgumentException', reason: 'Unimplemented SQL generation for predicate'

I am new to iphone development. I am trying to store some data using iphone core data. when i try to save i am getting error like.

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'

How to solve this problem .

Here is my code for saving data.

   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]);
}

Upvotes: 2

Views: 4847

Answers (1)

svena
svena

Reputation: 2779

According to Predicate Programming Guide Constraints and Limitations section you cannot use MATCHES keyword with sqlite persistent store.

Quote:

The matches operator uses regex, so is not supported by Core Data’s SQL store— although it does work with in-memory filtering.

In your case I would use BEGINSWITH or LIKE. Note, that BEGINSWITH has a performance edge, so I recommend using that whenever possible.

Here are the available predicate comparisons for strings:

String comparisons are by default case and diacritic sensitive. You can modify an operator using the key characters c and d within square braces to specify case and diacritic insensitivity respectively, for example firstName BEGINSWITH[cd] $FIRST_NAME.

BEGINSWITH

The left-hand expression begins with the right-hand expression.

CONTAINS

The left-hand expression contains the right-hand expression.

ENDSWITH

The left-hand expression ends with the right-hand expression.

LIKE

The left hand expression equals the right-hand expression: ? and * are allowed as wildcard characters, where ? matches 1 character and * matches 0 or more characters. In Mac OS X v10.4, wildcard characters do not match newline characters.

MATCHES

The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 (for more details see the ICU User Guide for Regular Expressions).

The exception here is MATCHES which cannot be used with sqlite persistent store as I said before. On top of those you can use plain == for strict equality comparison.

Upvotes: 1

Related Questions