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