gpt4 book ai didi

iphone - CoreData 查询帮助

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

我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询:

  1. 我有一个费用对象,它有一个费用金额字段。
  2. 费用可以链接到 ExpenseCategory 对象。
  3. ExpenseCategory 可能只定义费用类别(例如食品),也可能有单位费率(例如里程)。如果只是名称,则费用值为 Expense 对象中的费用金额,否则为 ExpenseCategory 中的费用金额 * unitRate。
  4. 由于“费用与类别”链接是可选的,因此最终费用将取决于类别是否存在以及单位费率。

因此计算总费用的 SQL 查询将是:

select
TOTAL(e.amount * IFNULL(c.rate, 1))
from EXPENSE e
LEFT OUTER join CATEGORY c on
e.category = c.id

如何在 CoreData 中完成此操作?

最佳答案

一个更简单的解决方案可能是在您的 Expense 类上实现另一种方法,该方法可以为您提供适当的计算金额。

例如

- (NSDecimalNumber *) calculatedExpenseAmount {

NSDecimalNumber *actualAmount = self.expenseAmount;

// Pseudo-code begins
if (self.expenseCategory != nil) {
actualAmount = self.expenseAmount * self.expenseCategory.unitRate;
}

return actualAmount;
}
<小时/>

我正在补充我之前的答案。

如果您想避免拉入每个托管对象,您可以使用 NSDictionary-result 查询来拉出expenseAmount 和expenseCategory.unitRate 值。

- (NSDecimalNumber *) totalExpenses
{
// Fetch all of the expense amounts and unit rate of any related category.

NSFetchRequest *request = ...;
[request setManagedObjectContext:<...>];
[request setEntity:<ExpenseAccountDescription>];
[request setResultType:NSDictionaryResultType];
NSArray *props = [NSArray arrayWithObjects:@"expenseAmount", @"category.unitRate", nil];
[request setPropertiesToFetch:props];

NSArray *amounts = [request executeRequest:...];
// amounts is an array of dictionaries, each hold the desired property values.

// Loop and sum the individual amounts

NSDecimal *total = [[NSDecimalNumber zero] decimalNumber];
NSAutoreleasePool *pool = nil; // contain the mess

NSCalculationError err = NSCalculationNoError;

for (NSDictionary *result in amounts)
{
pool = [NSAutoreleasePool new];

NSDecimal newTotal = [[NSDecimalNumber zero] decimalNumber];
NSDecimalNumber *expenseAmount = [result valueForKeyPath:@"expenseAmount"];
NSDecimalNumber *unitRate = [result valueForKeyPath:@"category.unitRate"];

if (unitRate != nil) {
// do the unit rate multiplication and accumulate the result in the total

NSDecimal calculated = [[NSDecimalNumber zero] decimalNumber];
err = NSDecimalMultiply (&calculated, [expenseAmount decimalNumber], [unitRate decimalNumber], NSRoundBankers);
if (err == NSCalculationNoError) {
err = NSDecimalAdd (&newTotal, total, calculated, NSRoundBankers);
}
}
else {
// just accumulate the result in the total

err = NSDecimalAdd (&newTotal, total, [expenseAmount decimalNumber], NSRoundBankers);
}

// Keep the new total
NSDecimalCopy(&total, newTotal);

[pool drain];
}

return [NSDecimalNumber decimalNumberWithDecimal:total];
}

如果您有 10000 个费用条目,则此提取和计算可能需要不到 1MB 的 RAM。仪器将是您测量这一点的 friend 。

关于iphone - CoreData 查询帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744267/

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