получение суммы всех экземпляров Entity B из данного экземпляра Entity A

У меня есть отношение ко многим между Entity A и Entity B (приложение iOS Core Data). Мне нужно получить сумму атрибута NSDecimalNumber всех экземпляров Entity B из данного экземпляра Entity A. У кого-нибудь есть учебник или пример этого?


person JohnnyRedTruss    schedule 09.03.2011    source источник


Ответы (1)


Вы должны использовать оператор @sum collection таким образом:

NSNumber *theSum=[ObjectA.objectBs valueForKey:@"@sum.numericalAttribute"];
person TechZen    schedule 09.03.2011
comment
Спасибо, @TechZen. компилятор жалуется, что он не совместим с KeyValueCoding. Нужно ли мне настраивать KeyValueObserver? Если да, то идет ли этот код в класс модели или в мой класс контроллера? Спасибо еще раз. - person JohnnyRedTruss; 10.03.2011
comment
ManagedObjects автоматически соответствуют ключу-значению. Вы должны быть осторожны, чтобы использовать правильный keypath. Итак, если ваш атрибут называется total, то ключевой путь будет @sum.total. Точно так же ObjectA.objectBs должен быть правильным путем с использованием имен в вашей модели. Ошибка о том, что управляемый объект не соответствует кодированию ключ-значение для ключа «независимо», означает, что вы указали неправильный путь к ключу. Обычно это вызвано опечатками. - person TechZen; 10.03.2011
comment
Спасибо @TechZen. Кажется, у меня была опечатка. Компилятор перестал жаловаться на соответствие ключ-значение. Теперь моя проблема заключается в том, куда я поместил этот фрагмент кода. Может быть, вы могли бы помочь. У меня есть пользовательская ячейка таблицы, где у меня есть метка, которая должна отображать сумму всех объектов objectB. Я создаю метод, который вычисляет это? Вот о чем я подумал: - (void)calculateTotalCost{ NSDecimalNumber *theTotalCost = [Envelope.expenses valueForKey:@sum.cost]; Envelope.totalCost = общая стоимость; } Это правильный подход или я ошибаюсь? - person JohnnyRedTruss; 15.03.2011
comment
Если расчет предназначен исключительно для отображения, то он должен идти в объект источника данных tableView, который по умолчанию является вашим tableViewController. Вы можете просто поместить строку в – tableView:cellForRowAtIndexPath:, где вы настраиваете ячейку для отображения. - person TechZen; 16.03.2011
comment
Однако если вы хотите включить его в модель данных, т. е. как атрибут объекта, то вам следует добавить к объекту переходный атрибут. Предоставьте пользовательский геттер для атрибута с кодом, и он будет пересчитывать сумму каждый раз при доступе к атрибуту, например. для объекта Envelope вы добавляете переходный атрибут totalCost, и каждый раз, когда вы используете something=anEnvelopeObj.totalCost, вы получаете вновь вычисленную сумму. - person TechZen; 16.03.2011
comment
Еще раз спасибо @TechZen за вашу помощь. Вот что у меня есть в configureCell: NSNumber *theSum = [Envelope.expenses valueForKey:@@sum.cost]; UILabel *envelopeExpensesLabel = (UILabel *) [ячейка viewWithTag:4]; ЯрлыкРасходов конверта.текст = Сумма; Компилятор жалуется, что ожидает ':' перед токеном '.' для строки кода оператора сбора. - person JohnnyRedTruss; 16.03.2011
comment
У вас есть подкласс NSManagedObject, определенный для Envelope? Если нет, вы не можете использовать точечный синтаксис и должны использовать valueForKey:, например: [[EnvelopeObj valueForKey:@"expenses"] valueForKey:@"@sum.cost"]; Если причина не в этом, то в коде перед строкой отсутствует скобка. - person TechZen; 16.03.2011
comment
Что ж, это исправило жалобу на компилятор, @TechZen. Теперь, когда я запускаю приложение и пытаюсь добавить новый конверт, я получаю эту ошибку: Серьезная ошибка приложения. Исключение было перехвачено делегатом NSFetchedResultsController во время вызова -controllerDidChangeContent:. [‹Envelope 0x9264› valueForUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключевых расходов. с userInfo { NSTargetObjectUserInfoKey = Envelope; NSUnknownUserInfoKey = расходы; - person JohnnyRedTruss; 16.03.2011
comment
Я нашел эту ссылку у Джеффа Ламарша iphonedevelopment.blogspot.com /2010/01/ Я думаю, что если расходов еще нет, то приложение вылетает? - person JohnnyRedTruss; 16.03.2011