我在核心数据中使用一对多关系数据库,用于专注于田径运动的iOS应用。
每个运动会话至少有4个与其相关联的“smartData”对象。随着时间的推移,创建了更多的smartData对象(可能超过一百个)。 “smartData”对象是日期+分数(双倍)。
我想知道如何更新与上次会话相关的所有分数。当我尝试使用for循环并且没有遇到崩溃时,它只替换了一组得分,显然,我想用另一组得分替换一组得分。
//获取会话和相关分数
// Fetch core data in the background and get the last session
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MMASession"];
NSArray *results = [[TBCoreDataStoreS1 privateQueueContext] executeFetchRequest:fetchRequest
error:nil];
self.lastMMASession = [results lastObject];
NSManagedObject *smartDataOfLastSession = [lastSession valueForKey:@"smartData"];
到目前为止,我了解所有事情。我有上一次会话的smartData,但我不知道如何替换整套分数。我有一个名为newScores的NSArray属性,它包含一组新的值。
for (int i = 0; i < [self.newScores count]; i++) {
[smartDataOfLastSession setValue:self.smartScores[i] forKey:@"smartScore"];
}
充其量,此方法会替换一个值的值集。我理解我的错误,但任何人都可以指出我的解决方案,这将是伟大的。
答案 0 :(得分:2)
您应该创建自己的NSManagedObject
子类。
在我的情况下,我有一个xcdatamodel
如下。
然后,您可以通过NSManagedObject
Xcode's File > New > File
子类
现在,您拥有NSManagedObject
子类,并且向导提供了您需要的实例方法。
如您所见,User.gamble是一种具有allObject方法的NSSet类型。
您可以使用[user.gamble allObject]
获取所有赌博。
以下是我的案例:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSArray *result = [self.managedObjectContext executeFetchRequest:request error:&error];
for(User *user in result)
{
for(Gamble *gamble in [user.gamble allObjects])
{
// DO SOMETHING HERE
}
}
在您的情况下,它将是[session.smartData allObject]
。