核心数据 - Fetch不会提供相同的结果

时间:2011-09-01 12:19:04

标签: ios core-data

所以我将ListItem添加到ListName中(在A类中设置了一对多的关系)

relationship

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

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

之后,B类通过名为

的委托方法

我希望从Core Data中获取数据,但是......如果我正在获取所有ListName,则ListItems不是最新的(例如,只有5个项而不是6个)。如果我获取所有ListItems,那么那里有所有(6个中的6个)。

我的代码有什么问题......我需要获取所有ListNames

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

}

2 个答案:

答案 0 :(得分:0)

鉴于您的数据模型和代码,两个地方的ListItem的计数没有理由相同,因为计数是两个不同的对象集合,不一定重叠。

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

ListName *test = [results objectAtIndex:0];
[test.listItems count];

...返回单个,特定和唯一ListItems对象关系中ListName个对象的计数。您可能有一个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)每个现有{{}时这样做。 1}}对象处于ListItems关系中。

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

顺便说一句,你应该几乎总是使用互惠关系,例如:如果您有ListNames.listNames,则应该有一个倒数ListNames.listItems

答案 1 :(得分:0)

一个简单的reset帮助了