托管对象值随机为null(包括示例项目)

时间:2013-07-23 07:27:14

标签: ios core-data

将数据(10条记录)保存到实体后,我正在处理获取请求以再次获取所有数据:

//Saving data
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    //Save to coredata


        song = [NSEntityDescription insertNewObjectForEntityForName:@"Song"
                                             inManagedObjectContext:context];
        [song setValue:title forKey:@"title"];

        [song setValue:songLink forKey:@"songWebLink"];
        NSLog(@"Song link : %@",songLink);//Never get NULL


        [song setValue:albumLink forKey:@"albumImageLink"];

        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }else{

            NSLog(@"Record saved correctly");
        }
}

保存上面的工作正常并且在保存到上下文之前我非常仔细地调试了所有数据,以确保没有属性NULL

问题始终在于songWebLink属性,有时当我尝试将其恢复到下面时它会变为空:

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    NSEntityDescription *songEntity=[NSEntityDescription entityForName:@"Song" inManagedObjectContext:context];
    NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
    [fetch setEntity:songEntity];
    NSError *fetchError;
    NSArray *fetchedSongs=[context executeFetchRequest:fetch error:&fetchError];

    NSMutableArray *songs = [[NSMutableArray alloc] init];

    for (NSManagedObject *songObject in fetchedSongs) {
    //here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th.
        NSLog(@"song web link: %@",[songObject valueForKey:@"songWebLink"]);//albumImageLink and title attributes are fine
    }
}

问题是当我NSLog songWebLink时,它变为NULL,一次用于第四次迭代,然后是第六次,然后是第二次等。它在获取时随机地为一个属性赋值NULL。保存数据时,我确保NULL没有songWebLink值。所以我打赌别的东西是造成这个问题的原因。

有什么想法吗?

修改

以下是MOC的初始化方式:

AppDelegate.m:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];//I tried initWithConcurrencyType:NSMainQueueConcurrencyType
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

让MOC对象在不同的​​类中使用它:

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication]delegate];
context = [appDelegate managedObjectContext];

示例项目 如果您认为需要查看应用程序项目,我制作了一个简化版本,我在其上复制了该错误,您可以下载它here

3 个答案:

答案 0 :(得分:0)

尝试一下:

在您的获取请求中包含此内容

[fetch setIncludesPropertyValues:YES];

迭代返回的对象,如下所示:

for (Song *songObject in fetchedSongs) {
    //here is the issue: this for loop will go through 10 iterations, songWebLink is randomly NULL, sometimes it's the fourth iteration, sometimes the 8th, sometimes the 5th.
    NSLog(@"song web link: %@",songObject.songWebLink);//albumImageLink and title attributes are fine
}

我不是百分之百确定这会解决它,但如果没有,它将有助于找到问题。

答案 1 :(得分:0)

从它的外观来看,你一直在main上运行,所以我认为没有线程/上下文问题。

XML解析器返回的数据类型可能与CoreData数据类型不匹配。

而不是像这样记录:

NSLog(@"Song link : %@",songLink);//Never get NULL

尝试:

NSLog(@"Song link : %@",[song valueForKey:@"songWebLink"]);
NSLog(@"Song link class : %@",[songLink class]);

我打赌你会在第一个日志中看到你的空值。第二个日志将有希望告诉您XML解析器实际返回的是什么类。你必须妥善处理它。

答案 2 :(得分:0)

经过几天试图解决这个问题,我选择了MagicalRecord,因为它简化了许多令人头痛的问题。如果有人能找出问题并帮助我,我会认为他的答案是公认的答案。