【发布时间】:2013-11-21 16:55:00
【问题描述】:
我有一个基本的 App Premise - 允许用户使用 FetchedResultsController 和 Core Data 向 4 个文本字段提供信息,并在表格视图中准确显示该信息。
我无法正确更新具有两个属性的实体。
我的实体是: 事务(isGiven 属性)
场合(dateOfEvent、标题属性)
人物(姓名属性)
项目(itemType 属性)。
Person 和 Item 在这里无关紧要。在 View Controller 的 Save Method 中,我调用我的 Occasion 类,将输入的 dateOfEvent 和标题传递给它。在这堂课中,我想要实现的是:
- 检查标题是否存在。如果没有,请创建一个。如果是,请将其退回。
- 检查日期是否存在。如果没有,请创建一个。如果是,请将其退回。
日期当前是一个字符串(稍后将更改为 NSDate - 我首先对此进行测试)。
我创建了一个复杂的 If 语句,但它只是没有适当地更新表视图。让我们看一些代码:
场合
+ (Occasion *)occasionWithTitle:(NSString *)title andEnteredDate:(NSString *)date inManagedObjectContext:(NSManagedObjectContext *)context
{
Occasion *occasion = nil;
// Creating a fetch request to check whether the name of the person already exists
NSFetchRequest *eventRequest = [NSFetchRequest fetchRequestWithEntityName:@"Occasion"];
eventRequest.predicate = [NSPredicate predicateWithFormat:@"title = %@", title];
NSSortDescriptor *eventSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES];
eventRequest.sortDescriptors = [NSArray arrayWithObject:eventSortDescriptor];
NSFetchRequest *dateRequest = [NSFetchRequest fetchRequestWithEntityName:@"Occasion"];
dateRequest.predicate = [NSPredicate predicateWithFormat:@"dateOfEvent = %@", date];
NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateOfEvent" ascending:YES];
dateRequest.sortDescriptors = [NSArray arrayWithObject:dateSortDescriptor];
NSError *error = nil;
NSArray *occasions = [context executeFetchRequest:eventRequest error:&error];
NSArray *dates = [context executeFetchRequest:dateRequest error:&error];
if (occasions)
{
if ([occasions count] == 0)
{
occasion = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
occasion.title = title;
if ([dates count] == 0)
{
occasion = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
occasion.dateOfEvent = date;
}
else
{
occasion = [dates lastObject];
}
}
else
{
occasion = [occasions lastObject];
if ([dates count] == 0)
{
occasion = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
occasion.dateOfEvent = date;
}
else
{
occasion = [dates lastObject];
}
}
}
else
{
// handle error
}
return occasion;
}
调用这个的保存方法是:
Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
Occasion *enteredOccasion = (Occasion *)[Occasion occasionWithTitle:self.occasionTextField.text andEnteredDate:self.dateTextField.text inManagedObjectContext:context];
transaction.occasion = enteredOccasion;
TableView 中仅显示“场合名称”的 fetchRequest 是:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Occasion" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dateOfEvent" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
当我选择一个场合名称时,我会转到另一个控制器,它会向我显示有关该场合的所有信息,包括人名、金额(与交易实体相关的东西),所以我的 fetchRequest 是:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"occasion.dateOfEvent" ascending:NO];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
fetchRequest.fetchBatchSize = 20;
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"occasion.dateOfEvent" cacheName:nil];
我知道 Occasion if 语句不太对劲 - 也许我只需要一个 insertNewObjectForEntityForName 因为它会在表格视图中创建各种不准确的结果 - 比如创建多个场合、日期等。
任何帮助将不胜感激!
【问题讨论】:
标签: ios objective-c core-data if-statement nsfetchedresultscontroller