CoreData NSManagedObject已损坏

时间:2013-02-23 02:30:06

标签: ios core-data

我有一个控制器,它是工作流程的根。如果工作流没有数据对象,那么我创建一个新的数据对象,如果存在,我使用现有的数据对象。我有一个模型对象的属性(NSManagedObject)

@property (nonatomic, retain) Round *currentRound;

我会在显示相应的视图时调用以下内容

self.currentRound = [self.service findActiveRound];
if (!self.currentRound) {
    NSLog((@"configure for new round"));
    self.currentRound = [self.service createNewRound];
    ...
} else {
    NSLog(@"configure for continue");
    // bad data here        
}

问题出在上面标记的地方,有时数据对象已损坏。在我没有显示的部分中,我在一些文本字段上设置值以表示模型中的值。有时它可以,但最终模型对象上的属性是空的,事情会中断

在调试器中,对回合的引用似乎没有改变,但NSLogging相关属性显示它们无效。调试似乎延迟了腐败的发生。

我知道我没有保存上下文...这有关系吗?如果是这样,我第一次回到这个控制器时怎么会总是失败?

我的findActiveRound消息并不特别,但万一重要

-(Round *) findActiveRound
{
    NSLog(@"Create Active Round");
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Round" inManagedObjectContext:context];
    [request setEntity:entity];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"isComplete == %@", [NSNumber numberWithBool:NO]];
    [request setPredicate:pred];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];

    if ([results count] == 0) {
        return nil;
    } else {
        return [results objectAtIndex:0];
    }
}

很多人。

编辑回复

损坏我的意思是当我试图从模型对象中获取一些简单的字符串属性时,我得到了nil值。所以在上面的代码中(我认为我有一个回合)我做的事情就像

self.roundName.text = self.currentRound.venue;
self.teeSelection.text = self.currentRound.tees;

并且看不到我输入的数据。由于它有时只会失败,但最终总是失败,我会在它消失之前看到我输入的数据。

我很确定上下文是一样的。我的服务是单身,并且像这样创建

@implementation HscService

+(id) getInstance
{
    static HscService *singleton = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        singleton = [[self alloc] init];
    });
    return singleton;
}

-(id) init
{
    if (self = [super init]) {
        model = [NSManagedObjectModel mergedModelFromBundles:nil];
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

        NSString *path = [self itemArchivePath];
        NSURL *storeUrl = [NSURL fileURLWithPath:path];

        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES],
                                 NSMigratePersistentStoresAutomaticallyOption,
                                 [NSNumber numberWithBool:YES],
                                 NSInferMappingModelAutomaticallyOption, nil];

        NSError *error = nil;
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
            [NSException raise:@"Open failed" format: @"Reason: %@", [error localizedDescription]];
        }

        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:psc];
        [context setUndoManager:nil];
    }
    return self;
}

-(NSString *) itemArchivePath
{
    NSArray *docDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dir = [docDirectories objectAtIndex:0];
    return [dir stringByAppendingPathComponent:@"hsc1.data"];
}

在每个控制器中我都会得到单例来执行操作。我计划在圆形操作中定义一个委托,并在我的AppDelegate中实现它,所以我只在应用程序中获得一次服务,但是现在不认为这应该重要....

1 个答案:

答案 0 :(得分:1)

您确定数据确实已损坏吗?托管对象上下文非常高效,并且调试器中的故障是正常的。来自文档:

  

“故障是核心数据用来减少你的机制的一种机制   应用程序的内存使用情况......“

请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

如果数据实际丢失且无法通过其他方法访问,请确保使用相同的托管对象上下文来访问数据。如果数据尚未提交到数据存储,则不会在MOC之间“同步”。