实体继承 - 核心数据iOS

时间:2012-10-08 22:45:23

标签: objective-c ios core-data nsfetchedresultscontroller nsfetchrequest

描述核心数据模型:

我有一个用于我的费用跟踪应用程序的核心数据模型。我创建了一个名为“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];

这从不打印“费用等级”,根本不会去那里。我不知道这将如何工作以及我将以何种方式放置此获取请求。

请帮帮我。我会很感激的。

谢谢

1 个答案:

答案 0 :(得分:0)

创建实体时,您应使用费用或收入作为实体名称,例如:

[NSEntityDescription insertNewObjectForEntityForName:@"Expense" inManagedObjectContext:context];

然后,当您使用实体名称“Money”获取时,它将按照您的预期拉出子实体。

相关问题