Создание базовой обратной связи данных - PullRequest
3 голосов
/ 10 марта 2009

Я пытаюсь написать свое первое приложение Cocoa, а Core Data затрудняет моделирование моих объектов данных. У меня есть две сущности, которыми я хочу манипулировать: Account и Transaction. Account имеет понятное человеку имя, и это все. Transaction хранит денежную стоимость и ссылки на два счета с именами debitAccount и creditAccount (я работаю над бухгалтерским приложением для двойной книги).

Я хочу иметь возможность найти все Transactions для данного Account, используют ли они debitAccount или creditAccount. Как я могу это сделать? Есть ли способ сделать это, который будет легко работать с привязкой пользовательского интерфейса Какао?

Ответы [ 2 ]

4 голосов
/ 10 марта 2009

Если я правильно вас понимаю, вы хотите, чтобы Транзакция была связана с Аккаунтом посредством двух отношений: debitAccount и creditAccount, да? И вы задаетесь вопросом о создании обратных отношений.

Короче говоря, отношения могут быть только противоположными другим отношениям. Таким образом, вы не сможете создать отношения, скажем, transactions, которые обратны как debitAccount, так и creditAccount. Вместо этого вам придется создать две взаимосвязи, например debitTransactions и creditTransactions (я уверен, что вы придумаете более подходящие имена для них ...)

Теперь, поскольку отношения моделируются как наборы (в частности, NSSet s), вы можете объединить отношения creditTransactions и debitTransactions для конкретной Учетной записи, чтобы получить все транзакции, в которых участвует учетная запись.

(возможно, лучшая) альтернатива состояла бы в том, чтобы ввести промежуточную сущность с именем, подобным TransactionAccount, которое имеет отношение «один к одному» с Account и Transaction, а также с атрибутом, например accountRole это идентифицирует счет как дебетовый или кредитный счет относительно этой конкретной транзакции. Вы бы создали отношения типа «обратный ко многим» для Transaction и Account с именем, например transactionAccounts. Таким образом, вы могли бы написать что-то вроде этого:

[account valueForKeyPath:@"transactionAccounts.transaction"]

чтобы получить все транзакции для определенного аккаунта. Вы можете использовать NSPredicate для фильтрации набора только для транзакций, в которых счет был дебетовым / кредитным счетом.

0 голосов
/ 13 марта 2009

Решение, которое работало лучше всего (и имело самый большой смысл) для меня, заключалось в создании подкласса NSManagedObject для использования в качестве моей Account сущности:

@interface Account : NSManagedObject {

}
-(NSArray*)getTransactions;
@end

У меня есть фактическая логика поиска внутри -getTransactions, что было не сложно сделать вручную. Пока это работает хорошо, особенно потому, что имя метода соответствует KVO.

Чтобы базовые данные возвращали Account с вместо NSManagedObject с, мне пришлось изменить свойство сущности "Class" в инструменте моделирования данных Xcode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...