Core Data error: -[myclass encodeWithCoder:]: unre

2019-05-24 10:30发布

问题:

I have a custom class MyClass that is essentially made up of several NSMutableArrays and no other variables. I have an entity MyEntity that has an ivar that is of MyClass. When I try to save the entity, I get this stack dump:

0   CoreFoundation                      0x0118ebe9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x012e35c2 objc_exception_throw + 47
2   CoreFoundation                      0x011906fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3   CoreFoundation                      0x01100366 ___forwarding___ + 966
4   CoreFoundation                      0x010fff22 _CF_forwarding_prep_0 + 50
5   Foundation                          0x00091bf6 _encodeObject + 1076
6   Foundation                          0x0009d041 +[NSKeyedArchiver archivedDataWithRootObject:] + 206
7   CoreData                            0x00eb7255 -[NSSQLiteConnection execute] + 2677
8   CoreData                            0x00f0b646 -[NSSQLiteConnection insertRow:] + 262
9   CoreData                            0x00f082d4 -[NSSQLConnection performAdapterOperations:] + 180
10  CoreData                            0x00f07f7e -[NSSQLCore _performChangesWithAdapterOps:] + 494
11  CoreData                            0x00f06a5a -[NSSQLCore performChanges] + 410
12  CoreData                            0x00f004a8 -[NSSQLCore saveChanges:] + 216
13  CoreData                            0x00ebe739 -[NSSQLCore executeRequest:withContext:error:] + 409
14  CoreData                            0x00f6eb1b -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 3691
15  CoreData                            0x00ef6db8 -[NSManagedObjectContext save:] + 712
16  MyProgram                              0x00006d19 -[DataParser parser:didEndElement:namespaceURI:qualifiedName:] + 1665
17  Foundation                          0x00104a19 _endElementNs + 453
18  libxml2.2.dylib                     0x01620e63 xmlParseXMLDecl + 1346
19  libxml2.2.dylib                     0x0162bb6d xmlParseChunk + 3984
20  Foundation                          0x0010421a -[NSXMLParser parse] + 321
21  MyProgram                              0x0000653e -[DataParser parseXMLFileAtURL:parseError:] + 176
22  MyProgram                              0x00002912 -[MyProgramAppDelegate application:didFinishLaunchingWithOptions:] + 664
23  UIKit                               0x002cc1fa -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
24  UIKit                               0x002ce55e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
25  UIKit                               0x002d8db2 -[UIApplication handleEvent:withNewEvent:] + 1533
26  UIKit                               0x002d1202 -[UIApplication sendEvent:] + 71
27  UIKit                               0x002d6732 _UIApplicationHandleEvent + 7576
28  GraphicsServices                    0x01ac4a36 PurpleEventCallback + 1550
29  CoreFoundation                      0x01170064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
30  CoreFoundation                      0x010d06f7 __CFRunLoopDoSource1 + 215
31  CoreFoundation                      0x010cd983 __CFRunLoopRun + 979
32  CoreFoundation                      0x010cd240 CFRunLoopRunSpecific + 208
33  CoreFoundation                      0x010cd161 CFRunLoopRunInMode + 97
34  UIKit                               0x002cdfa8 -[UIApplication _run] + 636
35  UIKit                               0x002da42e UIApplicationMain + 1160
36  MyProgram                              0x000023e6 main + 84
37  MyProgram                              0x00002389 start + 53

Does anyone have any suggestions at all what may be causing this? I believe it's probably related to MyClass, but how should I go about fixing this? Did I forget to write something for it?

回答1:

How did you define the myClass ivar in your entity? You can use a Transformable attribute to hold a non standard type. The idea is that Core Data uses behind the scenes an instance of NSValueTransformer to convert the attribute to and from an instance of NSData.

Core Data then stores the data instance to the persistent store.

By default is used the NSKeyedUnarchiverFromDataTransformerName, this means your custom class must implement the NSCoding protocol (with support for keyed-archiving)

Check "Non-Standard Persistent Attributes" in the Core Data Programming Guide for more details and description of another way to accomplish the same.