1

描述核心数据模型:

我的费用跟踪应用程序有一个核心数据模型。我创建了一个名为“Money”的抽象父实体,其属性为“vendor”、“date”、“amount”等。“费用”和“收入”这两个子实体继承自父实体“金钱”。然后还有其他实体,例如“Category”和“subCategory”及其属性。截至目前的总数:我的数据模型中有 5 个实体。

我有从子实体“费用”和“收入”到实体“类别”的关系,而实体“类别”又与实体“子类别”有一对多关系,因为一个类别可以有一个或多个子类别。实体“类别”与实体“费用”和“收入”具有一对多关系,并且可能存在特定类别的费用或收入。到目前为止,这对我来说很有意义。

我有一个表格视图,并使用 NSFetchedResultsController 来填充我的表格视图,其中包含混合 od 费用和收入。

我有一个带有“ExpenseS”和“Income”按钮的警报视图 - 两者都被推送到同一个视图控制器,其中包含诸如填写供应商、金额、类别、子类别和导航栏上的保存按钮等详细信息。

这是我的保存方法:

- (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];

这从不打印“费用类”,根本不去那里。我不知道这将如何工作以及我将以什么方法放置这个获取请求。

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

谢谢

4

1 回答 1

0

创建实体时,应使用 Expense 或 Income 作为实体名称,例如:

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

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

于 2012-10-09T02:46:51.783 回答