gpt4 book ai didi

iphone - 核心数据: Fetch all entities in a to-many-relationship of a particular object?

转载 作者:行者123 更新时间:2023-12-03 19:19:53 26 4
gpt4 key购买 nike

在我的 iPhone 应用程序中,我使用带有两个实体(ItemProperty)的简单核心数据模型:

项目
姓名
属性

属性
姓名

项目

Item 具有一个属性(名称)和一个一对多关系(属性)。它的逆关系是item属性有两个按反比关系的属性。

现在我想在两个级别的 TableView 中显示我的数据。第一个列出了所有项目;当选择一行时,一个新的 UITableViewController 会被推送到我的 UINavigationController 的堆栈上。新的 UITableView 应该显示所选项目的所有属性(即它们的名称)。

为了实现这一点,我使用 NSFetchedResultsController存储在实例变量中。在第一级,当设置 NSFetchedResultsController 时一切正常:

-(NSFetchedResultsController *) fetchedResultsController {
if (fetchedResultsController) return fetchedResultsController;

// goal: tell the FRC to fetch all item objects.
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.moContext];
[fetch setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[fetch setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetch setFetchBatchSize:10];

NSFetchedResultsController *frController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:self.moContext sectionNameKeyPath:nil cacheName:@"cache"];
self.fetchedResultsController = frController;
fetchedResultsController.delegate = self;

[sort release];
[frController release];
[fetch release];

return fetchedResultsController;
}

但是,在第二层UITableView上,我似乎做错了什么。我以类似的方式实现了 fetchedresultsController:

-(NSFetchedResultsController *) fetchedResultsController {
if (fetchedResultsController) return fetchedResultsController;

// goal: tell the FRC to fetch all property objects that belong to the previously selected item
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];

// fetch all Property entities.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Property" inManagedObjectContext:self.moContext];
[fetch setEntity:entity];

// limit to those entities that belong to the particular item
NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"item.name like '%@'",self.item.name]];
[fetch setPredicate:predicate];

// sort it. Boring.
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[fetch setSortDescriptors:[NSArray arrayWithObject:sort]];

NSError *error = nil;
NSLog(@"%d entities found.",[self.moContext countForFetchRequest:fetch error:&error]);
// logs "3 entities found."; I added those properties before. See below for my saving "problem".
if (error) NSLog("%@",error);
// no error, thus nothing logged.

[fetch setFetchBatchSize:20];

NSFetchedResultsController *frController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:self.moContext sectionNameKeyPath:nil cacheName:@"cache"];
self.fetchedResultsController = frController;
fetchedResultsController.delegate = self;

[sort release];
[frController release];
[fetch release];

return fetchedResultsController;
}

现在事情变得很奇怪了。以上NSLog语句返回所选项目的正确属性数量。但是,UITableViewDelegate 方法告诉我没有属性:

-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
NSLog(@"Found %d properties for item \"%@\". Should have found %d.",[sectionInfo numberOfObjects], self.item.name, [self.item.properties count]);
// logs "Found 0 properties for item "item". Should have found 3."
return [sectionInfo numberOfObjects];
}

相同的实现在第一层工作得很好。

事情变得更奇怪了。我实现了某种 UI 来添加属性。我通过 Property *p = [NSEntityDescription insertNewObjectForEntityForName:@"Property" inManagedObjectContext:self.moContext]; 创建一个新的 Property 实例,建立关系并调用[self.moContext save:&error] 。这似乎有效,如 error仍然是nil并且对象被保存(我可以在记录 Item 实例时看到属性的数量,见上文)。但是,委托(delegate)方法不会被触发。在我看来,这是由于 fetchRequest(Controller) 可能困惑所致。

有什么想法吗?我是否弄乱了第二个获取请求?这是获取特定实例的一对多关系中的所有实体的正确方法吗?

最佳答案

您需要实际执行 TableView Controller 的获取:

// ...create the fetch results controller...    
NSError *fetchRequestError;
BOOL success = [fetchedResultsController performFetch:&fetchRequestError];

关于iphone - 核心数据: Fetch all entities in a to-many-relationship of a particular object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com