2011-09-01 60 views
0

所以我加入一个ListItem到LISTNAME(有一个一对多的关系设置好的了),在A级核心数据 - 取不产生相同的结果

relationship

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

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

之后,B类是通过代理方法

在那里我想从核心数据中获取数据,但是...如果我要获取所有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 

} 
+0

我没有得到您的问题。 – Robin

+0

如果我正在读取listname,listitems的计数是5而不是6.如果我正在读取ListItems,那么它就是6 – gabac

回答

0

简单reset已帮助

+0

请勿将重置用作通用上下文重置。它旨在用于撤消管理员。 – TechZen

0

鉴于你的数据模型和代码,没有理由认为listItems中的两个地方作为计数是因为计数是两组不同的对象,不一定重叠。

第一计数由该代码给出:

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)现有的每个ListItems目标是在第一计数ListNames.listNames关系。

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

顺便说一句,你应该几乎总是使用互惠关系,例如如果你有ListNames.listItems你应该有一个互惠ListItems.listName

+0

thx很多,以供您解释! – gabac