2

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

1 に答える 1

1

述語プログラミングガイドの制約と制限のセクションによると、sqlite永続ストアでMATCHESキーワードを使用することはできません。

引用:

一致演算子は正規表現を使用するため、Core DataのSQLストアではサポートされていませんが、メモリ内フィルタリングでは機能します。

あなたの場合、私はBEGINSWITHまたはLIKEを使用します。BEGINSWITHにはパフォーマンスの優位性があるため、可能な限りそれを使用することをお勧めします。

文字列で使用可能な述語の比較は次のとおりです。

文字列の比較は、デフォルトでは大文字と小文字が区別され、発音区別符号に敏感です。角かっこ内のキー文字cとdを使用して演算子を変更し、大文字小文字と発音区別符号の区別をそれぞれ指定できます(例:firstName BEGINSWITH [cd] $ FIRST_NAME)。

BEGINSWITH

左側の式は右側の式で始まります。

含む

左側の式には右側の式が含まれています。

ENDSWITH

左側の式は右側の式で終わります。

お気に入り

左側の式は右側の式と同じです。および*はワイルドカード文字として使用できます。ここで?1文字に一致し、*は0文字以上に一致します。Mac OS X v10.4では、ワイルドカード文字は改行文字と一致しません。

試合

左側の式は、ICU v3に準拠した正規表現スタイルの比較を使用した右側の式と同じです(詳細については、正規表現のICUユーザーガイドを参照してください)。

ここでの例外は、前に述べたようにsqlite永続ストアでは使用できないMATCHESです。それらに加えて、厳密な等式比較のためにプレーン==を使用できます。

于 2012-05-28T08:11:20.547 に答える