2009-03-10 14 views
3

İlk Cocoa uygulamamı yazmaya çalışıyorum ve Çekirdek Veriler veri nesnelerini modellemeyi zorlaştırıyor. Değiştirmek istediğim iki varlığım var: Account ve Transaction. Account, insan tarafından okunabilir bir ada sahip ve bu konuda. Transaction, parasal bir değeri ve debitAccount ve creditAccount adlı iki hesaba başvurur (bir çift kitap muhasebe uygulaması üzerinde çalışıyorum).Bir Çekirdek Verisi Tersine İlişki Oluşturma

onlar debitAccount veya creditAccount kullanmak olsun, Account verilen tüm Transactions bulmak mümkün olmak istiyorum. Bunu nasıl yapabilirim? Kakao UI bağlama ile kolayca çalışacak bir yolu var mı?

cevap

0

iyi çalıştı (ve çoğu zamana) bana çözüm benim Account varlık olarak kullanmak NSManagedObject bir alt sınıfını yaratmaktı:

@interface Account : NSManagedObject { 

} 
-(NSArray*)getTransactions; 
@end 

Ben -getTransactions içindeki gerçek arama mantığı var, değildi elle yapmak çok zor değil. Bu, şu ana kadar iyi çalışıyor çünkü özellikle yöntem adı KVO'ya uygun.

Çekirdek Verileri, NSManagedObject s yerine Account s değerini döndürmek için, Xcode'un veri modelleme aracında varlığın "Sınıf" özelliğini değiştirmem gerekiyordu.

+0

Dikkatli olun. Ters ilişkilerin nedeni, modelin tutarlılığını sağlamaya yardımcı olmalarıdır. Bir ilişkinin hedefi olan ve tersi olmayan bir nesneyi silerseniz, söz konusu ilişkiyi kaldırdığınızdan emin olun, aksi takdirde geçersiz başvurularla sonuçlanırsınız. – Alex

+0

Bu yöntem, "-getTransactions" olarak adlandırılmamalıdır çünkü bir işlemlerin bir koleksiyonunu referans olarak döndürmez. "-allTransactions" veya benzeri bir şey kullanın. –

4

Doğru bir şekilde anlıyorsam, İşlem'in iki ilişki aracılığıyla Hesapla ilişkili olmasını istersiniz: debitAccount ve creditAccount, evet? Ve ters ilişkiler kurmayı merak ediyorsunuz. Kısaca, bir ilişki sadece bir başka ilişkinin tersi olabilir. Yani,ve creditAccount ve creditAccount'un tersi olan transactions adlı bir ilişki oluşturamayacaksınız. Bunun yerine, debitTransactions ve creditTransactions gibi, iki ilişki oluşturmanız gerekir ilişkiler setleri (özellikle, NSSet olarak modellenmiş olduğundan,

Şimdi (bunları daha uygun adlar ... düşün eminim) s), hesaba dahil olan tüm işlemleri almak için belirli bir Hesap için creditTransactions ve debitTransactions ilişkilerini birleştirebilirsiniz.

bir (muhtemelen daha iyi) bir alternatif olarak bir hesabı tanımlayan hem Account ve Transaction bir bire bir ilişki olarak accountRole gibi bir özellik, sahip olduğu TransactionAccount gibi bir ismi olan bir ara varlık kullanmak olacaktır söz konusu işleme göre borç veya kredi hesabı. Transaction ve Account'da transactionAccounts gibi bir adla çoktan çok ilişki oluşturursunuz. Bu şekilde, böyle bir şey yazabilirsiniz:

[account valueForKeyPath:@"transactionAccounts.transaction"] 

belirli bir hesap için tüm işlemleri alır. Ayarı yalnızca hesabın banka/kredi hesabı olduğu işlemlere göre filtrelemek için NSPredicate kullanabilirsiniz.

+0

Öneriniz için teşekkürler! Benim için işe yarayan bir yol buldum ama senin girişin yardım etti. –