描述核心数据模型:
我有一个用于我的费用跟踪应用程序的核心数据模型。我创建了一个名为“Money”的抽象父实体,其属性为“vendor”,“date”,“amount”等。两个子实体“费用”和“收入”继承自父实体“货币”。然后还有其他实体,例如“Category”和“subCategory”及其属性。截至目前的总数:我数据模型中的5个实体。
我从子实体“费用”和“收入”到实体“类别”之间存在关系,而实体“类别”又与实体“子类别”具有多对多的关系,因为类别可以有一个或多个子类别。实体“类别”与实体“费用”和“收入”具有多对多的关系,并且可以存在特定类别的费用或收入。这对我来说是有意义的。
我有一个表视图,并使用NSFetchedResultsController用混合od费用和收入来填充我的表视图。
我有一个带有“ExpenseS”和“Income”按钮的警报视图 - 两者都被推送到同一个视图控制器,其中包含导航栏上的填充供应商,数量,类别,子类别和SAVE按钮等详细信息。
这是我的保存方法:
- (void)saveMoney:(id)sender
{
AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [applicationDelegate managedObjectContext];
_money = (Money*) [NSEntityDescription insertNewObjectForEntityForName:@"Money" inManagedObjectContext:context];
double expenseAmt = [_amountTxtField.text doubleValue];
NSDate *expenseDate = [dateFormatter dateFromString:[NSString stringWithFormat:@"%@",currentDateLbl.text]];
_money.vendor = vendorTxtField.text;
_money.cat = categoryLbl.text;
_money.subcat = subCategoryLbl.text;
_money.amount = [NSNumber numberWithDouble:expenseAmt];
_money.date = expenseDate;
_money.photo = _templateImgView.templateImage.image;
_money.notes = notesLbl.text;
_money.paidBy = paidResourceLbl.text;
NSError * error = nil;
[context save:&error];
[self.navigationController dismissModalViewControllerAnimated:YES];
}
这将新的费用/收入保存到表格视图中,我在表格视图中得到了结果(费用/收入)的混合。但我怎么知道我的排是费用还是收入。我认为获取请求应该可以使它工作?但是应该放置这个获取请求的地方,用什么方法?我尝试使用以下代码:
AppDelegate * applicationDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext * context = [applicationDelegate managedObjectContext];
// Retrieve the entity from the local store -- much like a table in a database
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Money" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setIncludesSubentities:YES];
// Set the sorting -- mandatory, even if you're fetching a single record/object
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release]; sortDescriptors = nil;
[sortDescriptor1 release]; sortDescriptor1 = nil;
NSError * error;
NSArray * objects = [context executeFetchRequest:request error:&error];
for (Money* money in objects)
{
NSLog(@"money class");
if([money isKindOfClass:[Expense class]])
{
NSLog(@"expense class");
}
else
{
}
}
[context save:&error];
这从不打印“费用等级”,根本不会去那里。我不知道这将如何工作以及我将以何种方式放置此获取请求。
请帮帮我。我会很感激的。
谢谢
答案 0 :(得分:0)
创建实体时,您应使用费用或收入作为实体名称,例如:
[NSEntityDescription insertNewObjectForEntityForName:@"Expense" inManagedObjectContext:context];
然后,当您使用实体名称“Money”获取时,它将按照您的预期拉出子实体。