Ios 核心数据-获取不';我们不能提供同样的结果

Ios 核心数据-获取不';我们不能提供同样的结果,ios,core-data,Ios,Core Data,因此,我将在类a中的ListName中添加一个ListItem(设置了一对多关系) ListItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"ListItem" inManagedObjectContext:self.context]; //setting some attributes... [listName addListItemsObject:newItem]; [self.context sa

因此,我将在类a中的ListName中添加一个ListItem(设置了一对多关系)

ListItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"ListItem"
inManagedObjectContext:self.context];
//setting some attributes...

[listName addListItemsObject:newItem];
[self.context save:&error];    

之后,类B通过一个名为

在这里,我想从核心数据中获取数据,但是……如果我获取所有ListName,ListItems不是最新的(例如,只有5个项而不是6个项)。如果我获取所有列表项,则所有列表项都存在(6个列表项中的6个)

我的代码有什么问题…我需要得到所有的列表名

NSError *error;
NSFetchRequest *req = [[NSFetchRequest alloc] init];
if(context == nil)
   NSLog(@"context is nil");

NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListName" inManagedObjectContext:self.context];
[req setEntity:descr];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"lastModified" ascending:NO];

[req setSortDescriptors:[NSArray arrayWithObject:sort]];

NSArray * results = [self.context executeFetchRequest:req error:&error];

self.listNames = [results mutableCopy];
if ([results count] > 0) {
    ListName *test = [results objectAtIndex:0];
    [test.listItems count];
    NSLog(@"item count on list %i", [test.listItems count]);
    //wrong result

    NSFetchRequest *newReq = [[NSFetchRequest alloc] init];
    NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context];
    [newReq setEntity:descr];

    NSArray * results2 = [self.context executeFetchRequest:newReq error:&error];
    NSLog(@"item count on items %i", [results2 count]);
    //right result

}

给定您的数据模型和代码,没有理由认为两个位置的ListItems计数相同,因为计数是两组不一定重叠的不同对象

此代码给出了第一个计数:

ListName *test = [results objectAtIndex:0];
[test.listItems count];
…返回单个、特定且唯一的
ListName
对象关系中
ListItems
对象的计数。您可能有一个
ListName
对象,或者您可能有数百个对象,每个对象可能有任意数量的相关
ListItems
对象。此代码将只计算与返回的第一个
ListName
对象相关的值

第二次计数由以下公式得出:

NSFetchRequest *newReq = [[NSFetchRequest alloc] init];
NSEntityDescription *descr = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.context];
[newReq setEntity:descr];

NSArray * results2 = [self.context executeFetchRequest:newReq error:&error];
NSLog(@"item count on items %i", [results2 count]);
…它返回一个未筛选的数组,该数组包含持久存储中
ListItems
的每个实例,而不管它们之间有什么关系

没有特别的理由期望第一个计数与第二个计数一致,因为只有当(1)存储中有一个
ListNames
对象,并且(2)每个现有的
ListItems
对象都在该
ListNames.ListNames
关系中时,第一个计数才会与第二个计数一致

确保不要混淆实体和托管对象


顺便说一句,您几乎应该始终使用互惠关系,例如,如果您有
listName.listItems
,您应该有一个互惠的
listItems.listName

一个简单的帮助

如果我在获取listname,listitems的计数是5而不是6。如果我获取的是ListItems,那么就不要将reset用作通用上下文重置。它是为与管理员一起使用而设计的。