CoreData:实体中的可转换类型 | 获取失败

3
我是一个有用的助手,可以进行文本翻译。

我有一个实体; UserDefaults,它有一个属性; user_contacts,即Contacts(NSManagedObject模型)的列表。 我可以轻松地将其保存在我的 .sqlite 中。 但是当我尝试检索它时,会出现可怕的崩溃。 我使用这段代码来设置和获取我的UserDefaults;

设置:

for (int k = 0; k < allContactCopy.count; k++)
{
    Contact *contact = [allContactCopy objectAtIndex:k];
    Contact *contactAllData = [Contact getContactForNumber:contact.number];
    contactAllData.reg = NO;
    contactAllData.iD = contact.iD;
    contactAllData.name = contact.name;
    contactAllData.valTag = contact.valTag;
    [contactsAllWithNonRegData addObject:contactAllData];
}

UserDefaults *userD = (UserDefaults*)[[TTDatabaseManager sharedTTDatabaseManager] insertNewMOForModelName:@"UserDefaults"];
userD.user_contacts = [NSArray arrayWithArray:contactsAllWithNonRegData];
[[TTDatabaseManager sharedTTDatabaseManager] saveDataInManagedContext];

后续调用方法是:;
- (NSManagedObject*)insertNewMOForModelName:(NSString*)modelName
{
    NSManagedObject *objectManaged = [NSEntityDescription insertNewObjectForEntityForName:modelName
                                                                   inManagedObjectContext:self.managedObjectContext];
    return objectManaged;
}

抓取中:
UserDefaults *result = (UserDefaults*)[[TTDatabaseManager sharedTTDatabaseManager] fetchMODataWithModelName:@"UserDefaults" attributeNameToSortBy:@"user_contacts" ascending:NO predicate:nil];

它的连续调用方法是:

- (NSManagedObject*)fetchMODataWithModelName:(NSString *)modelName
                   attributeNameToSortBy:(NSString *)attribute
                               ascending:(BOOL)ascending
                               predicate:(NSPredicate *)predicate
{
    NSManagedObject *managedObject = nil;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:modelName
                                              inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:attribute
                                                                   ascending:ascending];

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setPredicate:predicate];

    NSError *error = nil;
    NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:fetchRequest
                                                                     error:&error];//IT CRASHES HERE

    if (fetchResults == nil)
    {
        // Handle the error.
        NSLog(@"executeFetchRequest failed with error: %@", [error localizedDescription]);
    }
    else if(fetchResults && [fetchResults count] > 0)
    {
        managedObject = [fetchResults objectAtIndex:0];
    }

    return managedObject;
}

self.managedObjectContext执行请求时,它会崩溃。我已经苦苦思索一整天,但仍然找不到原因。感谢您的帮助。崩溃细节如下:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Contact initWithCoder:]: unrecognized selector sent to instance 0x7f9d61c708e0'
*** First throw call stack:
(
0   CoreFoundation                      0x000000010bfb8d85 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x000000010b6a6deb objc_exception_throw + 48
2   Foundation                          0x0000000109584bda -[NSCoder(Exceptions) __failWithExceptionName:errorCode:format:] + 0
3   Foundation                          0x0000000109584dee -[NSCoder(Exceptions) __failWithExceptionName:errorCode:format:] + 532
4   Foundation                          0x00000001094e0859 _decodeObjectBinary + 3589
5   Foundation                          0x00000001094df94d _decodeObject + 281
6   Foundation                          0x0000000109502111 +[NSKeyedUnarchiver unarchiveObjectWithData:] + 89
7   CoreData                            0x000000010bb17b63 _prepareResultsFromResultSet + 3411
8   CoreData                            0x000000010bb14fdd newFetchedRowsForFetchPlan_MT + 3293
9   CoreData                            0x000000010bb01bac -[NSSQLCore objectsForFetchRequest:inContext:] + 524
10  CoreData                            0x000000010bb01549 -[NSSQLCore executeRequest:withContext:error:] + 377
11  CoreData                            0x000000010bbe6eaf __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 3311
12  CoreData                            0x000000010bbf04dd gutsOfBlockToNSPersistentStoreCoordinatorPerform + 189
13  libdispatch.dylib                   0x000000010c7693eb _dispatch_client_callout + 8
14  libdispatch.dylib                   0x000000010c74def5 _dispatch_barrier_sync_f_invoke + 393
15  CoreData                            0x000000010bbe15d5 _perform + 197
16  CoreData                            0x000000010bb011b4 -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 500
17  CoreData                            0x000000010baff973 -[NSManagedObjectContext executeFetchRequest:error:] + 579
18  tellotalk                           0x0000000107992b24 -[TTDatabaseManager fetchMODataWithModelName:attributeNameToSortBy:ascending:predicate:] + 532
19  tellotalk                           0x00000001079a9b1b -[ChatListViewController viewWillAppear:] + 459
20  UIKit                               0x0000000109da82bd -[UIViewController _setViewAppearState:isAnimating:] + 710
21  UIKit                               0x0000000109da8958 -[UIViewController __viewWillAppear:] + 149
22  UIKit                               0x0000000109d75de7 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 934
23  UIKit                               0x0000000109c13f62 _runAfterCACommitDeferredBlocks + 317
24  UIKit                               0x0000000109c27e4c _cleanUpAfterCAFlushAndRunDeferredBlocks + 95
25  UIKit                               0x0000000109c34147 _afterCACommitHandler + 90
26  CoreFoundation                      0x000000010beddc37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
27  CoreFoundation                      0x000000010beddba7 __CFRunLoopDoObservers + 391
28  CoreFoundation                      0x000000010bed37fb __CFRunLoopRun + 1147
29  CoreFoundation                      0x000000010bed30f8 CFRunLoopRunSpecific + 488
30  GraphicsServices                    0x000000010e5adad2 GSEventRunModal + 161
31  UIKit                               0x0000000109c07f09 UIApplicationMain + 171
32  tellotalk                           0x00000001079904ff main + 111
33  libdyld.dylib                       0x000000010c79d92d start + 1
34  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

请添加您设置转换的方式。 - Amin Negm-Awad
@AminNegm-Awad 已更新,请查看。 - Mohsin Khubaib Ahmed
1个回答

2
你的方法完全错误,特别是问题所在的那一行。
userD.user_contacts = [NSArray arrayWithArray:contactsAllWithNonRegData];

因为你已经使属性可转换,所以使用NSCoding将数组转换为数据以存储在SQLite中。显然,归档过程无法在上下文中创建适当的托管对象,因此会出现崩溃。

你需要摆脱数组,并使用关系代替属性。


我同意你所说的。我会调查一下并给你回复。请问,您能帮忙解释一下这句话的意思吗?“您需要摆脱数组,并使用关系而不是属性。” - Mohsin Khubaib Ahmed
你有一个可转换的属性,你应该用关系来替换它。如果这样做,你就不会有一个数组,也不需要进行任何转换,Core Data 将提供一个集合。 - Wain
非常好,我明白了。不过,你能否推荐给我一个示例链接或代码片段来完成同样的内容呢?我很想要这种实现方式。那样就算是完整回答了,我会标记它为已解决。谢谢Wain。 - Mohsin Khubaib Ahmed
https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/HowManagedObjectsarerelated.html - Wain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接