我对目标c和iOS都很陌生,非常感谢这里的一些帮助。 我一直在撞墙试图让这个工作,但不断得到错误:
Failed to save to data store: The operation couldn’t be completed. (Cocoa error 1570.)
我正在做的是导入CSV文件。
据我所知,这部分有效。正确地解析了CSV,我得到了所有正确的值,并且我已经通过我可以告诉KA对象获得正确的值进行了调试。
但是我的关系似乎有些不对劲 - 1570问题来自nil newTrainingDay所需的日期字段(这似乎是在我调试时填充的)。我有一种感觉还有别的错,但我不确定是什么......
有谁能告诉我这里我做错了什么?
答案 0 :(得分:1)
我认为问题源于创建新对象并将其插入数据库,然后搜索是否存在满足您需求的现有对象。拿这个代码,例如:
// look for existing day
KATrainingDay *newTrainingDay = [NSEntityDescription insertNewObjectForEntityForName:@"KATrainingDay" inManagedObjectContext:self.managedObjectContext];
// Fetching
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"KATrainingDay"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];
// Execute Fetch Request
fetchError = nil;
NSArray *trainingDays = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
// if you found it
if (!fetchError) {
if ([trainingDays count]) {
for (KATrainingDay *day in trainingDays) {
newTrainingDay = day;
}
} else {
// set name and date for training day
newTrainingDay.date = date;
newTrainingDay.name = trainingDayNameString;
[newTrainingDay addRoutinesObject:newTrainingRoutine];
[newTrainingRoutine addTrainingDaysObject:newTrainingDay];
}
首先在您的上下文中创建并插入KATrainingDay
,然后进行抓取以查找具有正确日期的KATrainingDay
。如果找到它,则将指针(newTrainingDay
)分配给刚刚获取的对象。 但是你刚刚插入的对象仍然在上下文中(虽然你不再有指向它的指针)并且它的所有属性和关系都有nil值。因此当你保存时,那个对象就失败了所需日限制。
要解决此问题,请仅在找不到与fetch匹配时插入新对象:
// look for existing day
KATrainingDay *newTrainingDay;
// Fetching
fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"KATrainingDay"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];
// Execute Fetch Request
fetchError = nil;
NSArray *trainingDays = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
// if you found it
if (!fetchError) {
if ([trainingDays count]) {
for (KATrainingDay *day in trainingDays) {
newTrainingDay = day;
}
} else {
// set name and date for training day
newTrainingDay = [NSEntityDescription insertNewObjectForEntityForName:@"KATrainingDay" inManagedObjectContext:self.managedObjectContext]
newTrainingDay.date = date;
newTrainingDay.name = trainingDayNameString;
}
[newTrainingDay addRoutinesObject:newTrainingRoutine];
(同样适用于其他实体)。在上面我已经将addRoutinesObject:
调用移到了else块之外,所以无论你找到现有的还是创建new(我假设你想要的)它都会执行。请注意,您不需要设置关系的两侧 - 如果您设置一侧,CoreData会自动为您执行另一侧(假设它们被定义为反转)。另外一个提示,你不需要你的for循环来获取数组中的最后一项,你可以使用:
newTrainingDay = [trainingDays lastObject];