为什么我的默认记录被覆盖(CoreData)?

时间:2012-11-06 14:22:32

标签: objective-c xcode core-data

我有一个CoreData实体(称为“MyData”),它具有与用户在我的一个UIViewControllers上的各种UIControl中输入的内容相关的属性,以及一个属性(“recordKey”),它是唯一的标识符每条记录。当用户打开页面时,我想检查是否已经有该记录键的记录。如果是,则加载它并根据该记录中的内容设置所有控件。如果没有,请根据“默认”记录设置所有控件并为此会话创建新记录,然后在用户退出时保存新会话,但保持“默认”记录不变。到目前为止,我的代码(viewDidLoad)是:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate];
NSString *table = @"MyData";
NSError *error;
NSManagedObjectContext *context = [app managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:table inManagedObjectContext:context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordKey LIKE %@", self.recordKey];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setPredicate:predicate];
[request setEntity:entity];

NSArray *arr = [context executeFetchRequest:request error:&error];
if (arr.count == 0)
{
    // No entries exist for this recordKey, so use default values
    predicate = [NSPredicate predicateWithFormat:@"recordKey LIKE %@", @"DEFAULT"];
    [request setPredicate:predicate];
    NSArray *defaultArr = [context executeFetchRequest:request error:&error];
    if (defaultArr.count == 1)
    {
        MyData *defaultData = [defaultArr objectAtIndex:0]; //create placeholder for for default data
        currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context]; //create a new row to correspond to this session
        currentData = defaultData; //preload with default values
        currentData.recordKey = self.recordKey; //set record key for this session to it's unique identifier
    }
    else
    {
        NSLog(@"Error - DEFAULT record not found in table '%@', or multiple DEFAULT records found, in viewDidLoad on RunwayAnalysisController.m",table);
    }
}
else if (arr.count == 1)
{
    // Record found for this recordKey, so set it as the current MyData object
    currentData = [arr objectAtIndex:0];
}

然后当我离开控制器时,我只是

if (![context save:&error])
{
    NSLog(@"Error writing entry to %@ table in saveClick on RunwayAnalysisController.m",table);
}

当我运行此操作时,我的默认记录将被用户在此会话期间所做的任何更改所覆盖。我认为问题是currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context]; currentData = defaultData;没有做我想要的事情 - 创建一个新条目,用默认记录中的信息加载该条目,然后用默认记录切断绑定并将其置于它自己的当用户与页面上的控件交互时填充。我可能误解了这两条线中究竟有哪一条在做什么。有没有人在这里看到我做错了什么,并建议如何解决它?

1 个答案:

答案 0 :(得分:1)

AFAIK您不能简单地获取CoreData对象并将其重新插入到managedObjectContext中。如果要创建副本,请创建新的managedObject并设置默认值。

在您的ObjectModel中,您甚至可以将默认值设置为实体...这是我猜的更好的方法。然后,您只需创建一个新的managedObject并修改需要修改的内容。无需复制。 (只要您的默认模型不会更改。)

创建托管对象的方式对我来说很好看

MyData *defaultData = [defaultArr objectAtIndex:0];
currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context];

但是,通过设置currentData = defaultData;,您将覆盖以前的对象。你应该这样做:

currentData.var1 = defaultData.var1;
currentData.var2 = defaultData.var2;
...
相关问题