【问题标题】:Core Data saving a NS(Mutable)Array fails保存 NS(Mutable)Array 的核心数据失败
【发布时间】:2012-07-17 21:39:50
【问题描述】:

我在使用 Core Data 时遇到问题。我有两个实体(文章和制造商)(一个包含一个可转换属性,它是另一个实体的数组)。在我尝试将数组添加到 NSManagedObject 之前,一切正常。这是一些代码:

@implementation HASArticleInitializer

- (void)initialize:(NSArray *)initArray {
    //Alloc and init some local variables
    NSMutableArray *articleEntitiesArray = [NSMutableArray alloc] init];
    for (NSInteger pageIndex = 1; pageIndex <= pageCount; pageIndex++) {

        //Parsing the website

        //For-loop for every object on every page
        for (NSInteger object = 0; object < [articleNumbersOnOnePageArray count]; object++) {
            //Doing other string manipulation and parsing stuff


            NSManagedObject *newArticleEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Article"inManagedObjectContext:context];

            [newArticleEntry setValue:[NSString stringWithFormat:@"%@_%@", manufacturerNumber, articleNumber] forKey:@"number"];
            [newArticleEntry setValue:articleTextComplete forKey:@"text"];
            [newArticleEntry setValue:articleStatus forKey:@"status"];
            [newArticleEntry setValue:manufacturerName forKey:@"manufacturerName"];
            [newArticleEntry setValue:manufacturerNumber forKey:@"manufacturerID"];

            [articleEntitiesArray addObject:newArticleEntry];
        }
    }

    NSManagedObject *newManufacturerEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Manufacturer" inManagedObjectContext:context];

    //Encoding the NSArray and setting the entity attribute to Binary Data doesn't work neither
    //NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:articleEntitiesArray];

    [newManufacturerEntry setValue:manufacturerName forKey:@"name"];
    [newManufacturerEntry setValue:manufacturerNumber forKey:@"manufacturerID"];
    [newManufacturerEntry setValue:manufacturerCount forKey:@"count"];
    [newManufacturerEntry setValue:articleEntitiesArray forKey:@"articles"];
    NSLog(@"%@", articleEntitiesArray);
}


@end

我尝试了所有我认为可以或无济于事的方法,我确实花了好几天的时间,但是当调用 AppDelegate 的 - (IBAction)saveAction:(id)sender 方法时,我总是收到以下错误:

[15836:a057] -[NSManagedObject encodeWithCoder:]: unrecognized selector sent to instance 0x1001896e0
[15836:a057] An uncaught exception was raised
[15836:a057] -[NSManagedObject encodeWithCoder:]: unrecognized selector sent to instance 0x1001896e0
[15836:a057] (
0   CoreFoundation                      0x00007fff8dc94716 __exceptionPreprocess + 198
1   libobjc.A.dylib                     0x00007fff8bfe6470 objc_exception_throw + 43
2   CoreFoundation                      0x00007fff8dd2ad5a -[NSObject(NSObject) doesNotRecognizeSelector:] + 186
3   CoreFoundation                      0x00007fff8dc82c3e ___forwarding___ + 414
4   CoreFoundation                      0x00007fff8dc82a28 _CF_forwarding_prep_0 + 232
5   Foundation                          0x00007fff86931401 _encodeObject + 1163
6   Foundation                          0x00007fff869323cc -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 410
7   Foundation                          0x00007fff869320c9 -[NSArray(NSArray) encodeWithCoder:] + 473
8   Foundation                          0x00007fff86931401 _encodeObject + 1163
9   Foundation                          0x00007fff869358f9 +[NSKeyedArchiver archivedDataWithRootObject:] + 182
10  iLoadPix                            0x0000000100003c21 -[HASArticleInitializer initialize:] + 3793
11  Foundation                          0x00007fff86926842 __NSThread__main__ + 1345
12  libsystem_c.dylib                   0x00007fff88553782 _pthread_start + 327
13  libsystem_c.dylib                   0x00007fff885401c1 thread_start + 13

核心数据模型: Entity 1 Entity 2

正如我所说,如果我不保存数组,一切正常,NSLog 也是正确的。如果这很重要,我会使用 NSThreads(但我不这么认为,因为其他一切都很好):-(

请帮帮我!提前非常感谢! :-(

【问题讨论】:

    标签: core-data nsarray nsmanagedobject


    【解决方案1】:

    可转换的属性是通过键控归档/取消归档来归档的……但是 NSManagedObject 并非旨在以这种方式归档。 (它没有实现NSCoding 协议。)

    要解决这个问题,您可以将托管对象转换为字典表示形式,但最自然的做法似乎是在 2 个实体之间使用核心数据关系。您没有在这里建立关系模型是有原因的吗?

    【讨论】:

    • 其实我确实有他们之间的关系,但我想我不使用它们(我在上面添加了模型的图片。我的应用程序中有两个表格视图,一个显示制造商,另一个显示所属文章。所以我将 ArticleController 的 Content Array 绑定到 ManufacturerArrayController。
    • 抱歉——我没有仔细阅读。为什么要保存数组?
    • 因为我想在articlesTableView中显示它们。没有数组有没有办法做到这一点?还是不保存它们?
    • 嗯(几乎)核心数据的全部意义在于持久性......无论如何,相同的信息存储在您的关系中。对于您的表格,只需执行核心数据获取(查询)即可获取您想要在表格中显示的感兴趣的对象。你是这个意思吗?
    • 抱歉,我睡着了 ;-)(在德国已经过了一夜)...是的,这正是我想要的和我尝试的,但我没有不要让它工作。这就是我更改制造商实体以保存文章数组的原因。你能否给我一个提示如何做到这一点? (感谢您的耐心等待!)
    猜你喜欢
    • 2011-10-11
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多