Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我的默认记录被过度写入(CoreData)?_Objective C_Xcode_Core Data - Fatal编程技术网

Objective c 为什么我的默认记录被过度写入(CoreData)?

Objective c 为什么我的默认记录被过度写入(CoreData)?,objective-c,xcode,core-data,Objective C,Xcode,Core Data,我有一个CoreData实体(称为“MyData”),该实体具有与用户在我的一个UIViewController上的各种uicontrol中输入的内容相关的属性,还有一个属性(“recordKey”),是每个记录的唯一标识符。当用户打开页面时,我想检查是否已经有该recordKey的记录。如果是这样,则加载它并根据该记录中的内容设置所有控件。如果没有,则根据“默认”记录设置所有控件,并为此会话创建新记录,然后在用户退出时保存新会话,但保持“默认”记录不变。到目前为止,我的代码(在viewDidL

我有一个CoreData实体(称为“MyData”),该实体具有与用户在我的一个UIViewController上的各种uicontrol中输入的内容相关的属性,还有一个属性(“recordKey”),是每个记录的唯一标识符。当用户打开页面时,我想检查是否已经有该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:TableinManagedObjectContext:context];currentData=默认数据
没有完成我希望它做的事情-创建一个新条目,用默认记录中的信息加载该条目,然后断开与默认记录的连接,并在用户与页面上的控件交互时自行填充。我可能误解了这两行中的一行到底在做什么。是否有人看到我在这里做错了什么,并建议如何修复它?

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

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

我觉得你创建managedObject的方式很好

MyData *defaultData = [defaultArr objectAtIndex:0];
currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context];
但是,通过设置
currentData=defaultData覆盖上一个对象。你应该做:

currentData.var1 = defaultData.var1;
currentData.var2 = defaultData.var2;
...

因此,您不能简单地获取CoreData对象并将其重新插入managedObjectContext。如果要复制,请创建新的managedObject并设置默认值

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

我觉得你创建managedObject的方式很好

MyData *defaultData = [defaultArr objectAtIndex:0];
currentData = [NSEntityDescription insertNewObjectForEntityForName:table inManagedObjectContext:context];
但是,通过设置
currentData=defaultData覆盖上一个对象。你应该做:

currentData.var1 = defaultData.var1;
currentData.var2 = defaultData.var2;
...

啊,我不知道我可以为一个实体设置默认值。这很有帮助,但我可能需要为不同的用户设置不同的默认值(因此,我将使用类似于
recordKey=@“DEFAULT”
的东西,而不是
recordKey=@“DEFAULT USER1”
,等等)。我可能会在将来使用它,所以谢谢你。至于“创建一个新的managedObject”部分,我认为这就是我在上一段引用的代码中所做的。我该如何创建一个新的managedObject?啊,我看到了你的编辑,我想
currentData=defaultData
是一种与
currentData.var1=defaultData.var1;完全相同的短方法。看来这就是我的误解所在。让我试一试。记住变量和指针之类的东西。基本上,您确实将defaultData指针分配给了currentData,因此删除了它的旧content.gah,dang OOP。我有过程编程的背景,所以我唯一需要担心的是一个名称为1的变量,而不是在另一个名称的变量中写入值,那就是在复杂的子例程调用中。我会记住这一点-谢谢。啊,我不知道我可以为一个实体设置默认值。这很有帮助,但我可能需要为不同的用户设置不同的默认值(因此,我将使用类似于
recordKey=@“DEFAULT”
的东西,而不是
recordKey=@“DEFAULT USER1”
,等等)。我可能会在将来使用它,所以谢谢你。至于“创建一个新的managedObject”部分,我认为这就是我在上一段引用的代码中所做的。我该如何创建一个新的managedObject?啊,我看到了你的编辑,我想
currentData=defaultData
是一种与
currentData.var1=defaultData.var1;完全相同的短方法。看来这就是我的误解所在。让我试一试。记住变量和指针之类的东西。基本上,您确实将defaultData指针分配给了currentData,因此删除了它的旧content.gah,dang OOP。我有过程编程的背景,所以我唯一需要担心的是一个名称为1的变量,而不是在另一个名称的变量中写入值,那就是在复杂的子例程调用中。我会记住这一点-谢谢。你已经写了你的实体中有两个属性,一个是recordKey,另一个是什么?假设它名为myDataAttribute,我认为应该用currentData替换currentData=defaultData。myDataAttribute=defaultData@MichelePercich:实际上,有许多属性,如“switch1State”、“textbox1Text”、“switch2State”等。至于你的建议,那不是类型不匹配吗?currentData和defaultData都是MyData对象,而currentData.switch1State是一个NSNumber(其整数值我以后会像
[self.switch1 setValue:[currentData.switch1State integerValue]];
。你是说这就是我做错的吗?好的,我现在明白了。你应该按照gamma的建议。你已经写了你的实体中有两个属性,一个是recordKey,另一个是什么?让我假设它名为myDataAttribute,我想你应该替换currentData=defaultDat