gpt4 book ai didi

ios - 为特定对象保存 managedObjectContext

转载 作者:行者123 更新时间:2023-11-29 03:24:49 27 4
gpt4 key购买 nike

我正在尝试学习核心数据,但在将新对象添加到现有对象后更新 MOC 时遇到问题。我可以创建原始对象(训练日),并且可以将练习对象添加到该训练日,但我不知道如何保存上下文,以便稍后在我的应用程序中可以找到训练日中的所有练习。

有什么想法吗??

这是我的代码:

// Data from JSON
NSArray *trainingDayData = responseData[@"training_days"];
for (NSDictionary *aTrainingDay in trainingDayData) {

// Find the specific training day and save the MOC, creating the trainingDayObject
NSNumber *idTrainingDay = [NSNumber numberWithInt:[[aTrainingDay objectForKey:kID_KEY] intValue]];
VitTrainingDay *trainingDayObject = [VitTrainingDay trainingDayCreateOrObjectWithID:idTrainingDay];

// Configure the VitTrainingDay object's fields
trainingDayObject.name = aTrainingDay[@"name"];
trainingDayObject.order = aTrainingDay[@"order"];

}
// assign exercises to each trainingDayObject(this is inside a larger for loop)
trainingDayObject.userExercise = [NSSet setWithArray:userExerciseObjects];

// Below are attempt one and two to update the MOC after assigning exercises to the trainingDayObject.

// This works to save the updated MOC, but also adds two blank trainingDayObjects, since it 'insertNewObjectForEntityName', which I don't want.
trainingDayObject = [NSEntityDescription insertNewObjectForEntityForName:@"TrainingDay" inManagedObjectContext:self.context];

//This as far as I can tell is doing nothing. It just points to the conventional MOC save method. I pull it out below.
[self.coreDataManager saveContextForManagedObjectContext:self.context];

这是我上面调用的 saveContextForManagedObjectContext 方法:

- (void)saveContextForManagedObjectContext:(NSManagedObjectContext *)moc
{
NSError *error = nil;
if (![moc save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}

最佳答案

我对你的循环有点困惑,但假设第一个循环用于获取每个训练日,设置一些值,然后获取当天的练习并设置关系,请尝试以下操作。

请注意,下面这行代码是创建 NSManagedObject 的代码,因此您需要调用它来创建每个 TrainingDay 对象和每个 Exercise 对象。

trainingDayObject = [NSEntityDescription insertNewObjectForEntityForName:@"TrainingDay" inManagedObjectContext:self.context];

不确定这一行的作用,但大概它会创建一个新对象或返回一个已存在的对象

VitTrainingDay *trainingDayObject = [VitTrainingDay trainingDayCreateOrObjectWithID:idTrainingDay];

除非它还调用了 insertNewObjectForEntityForName,否则它应该被替换为创建 NSManagedObject 或搜索并返回具有匹配 ID 的调用。如果它正在调用 insertNewObjectForEntityForName,那么您应该删除下面的行,因为这只会在数据库中创建另一个 trainingDay 对象,而无需设置任何属性值。

尝试这样的事情

    // Data from JSON
NSArray *trainingDayData = responseData[@"training_days"];

for (NSDictionary *aTrainingDay in trainingDayData) {

// Find the specific training day ID
NSNumber *idTrainingDay = [NSNumber numberWithInt:[[aTrainingDay objectForKey:kID_KEY] intValue]];

//Create the Core Data Object
//Assume VitTrainingDay is a NSManagedObject subclass
VitTrainingDay *trainingDayObject = [NSEntityDescription insertNewObjectForEntityForName:@"TrainingDay" inManagedObjectContext:self.context];

// Set the attributes
trainingDayObject.ID = idTrainingDay;
trainingDayObject.name = aTrainingDay[@"name"];
trainingDayObject.order = aTrainingDay[@"order"];


// assign exercises to each trainingDayObject
for (SomeSourceObject *object in SomeExercisesSource) {
ExerciseObject *exercise = [NSEntityDescription insertNewObjectForEntityForName:@"ExerciseObject" inManagedObjectContext:self.context];

// Set the exercises parent object (training day)
exercise.trainingDay = trainingDayObject;
exercise.details = object.details;

}

}


NSError *error = nil;
if (![self.context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
} else {
NSLog(@"Save successful");
}

我的猜测是您需要在创建新对象之前搜索具有相同 ID 的现有 TrainingDay 对象,所以如果这就是调用 [VitTrainingDay trainingDayCreateOrObjectWithID:idTrainingDay]; 然后使用它来代替.

关于ios - 为特定对象保存 managedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20589938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com