2011-10-27 5 views
5

Nesnede bir Çekirdek Veri NSFetchRequest yapıyorum c. Veri modelinde soyut bir ana varlık (4 temel öznitelik içerir) ve üst öğede bulunmayan özniteliklere sahip birçok farklı çocuk varlıkları vardır. Bazı çocuklar aynı adı ve veri türlerini paylaşan özellikler içerir.A Çekirdek Verileri Çocuk Varlıklarının bir özellik veya "anahtar yolu" içerip içermediğini kontrol etmek için öneriniz var mı?

bir "ana yol" olup olmadığını görmek için çocuk varlıklar tüm örneklerini arar böylece, ebeveyn varlığa fetchRequest uyguluyorum.

Ben sadece belirli bir özelliği içeren çocuk varlıkları dönecektir bir yüklemi inşa miyim?

İşte
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name]; 

, nitelik NSAttributeDescription bir örneğidir ve hedef özelliklerin kendi listenizde eşleşen ada sahip bir özellik olan diğer kuruluşlar aramak, ama biçimlendirmek nasıl emin değilim yüklem.

Gerekirse daha fazla açıklığa kavuşabilirim. Teşekkürler! (Daha iyi yardımcı yokluğunda) bazı deney layık

cevap

5

Eğer örneklerini yerine modelini teftiş edilir bir nedeni var mı: Sonra bir böyle yüklemi getirme yapabilir? Kolayca öğrenebilirsiniz hangi varlık türlerini ben de, o hata karşılaştım verilen bir özellik

for (NSEntityDescription* entityDescription in [self managedObjectModel]) { 
    if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) { 
    // objects of this entity support the property you're looking for 
    } 
} 
+0

Örnekleri sorgulamam gerekiyor çünkü nihai amaç, özniteliğin farklı değerlerini tanımlayan tüm örneklerden elde etmektir. Wienke'nin önerdiği geçici çözüm için dizinsel olarak tablo oluşturmak için burada listelediğinize benzer bir döngü kullanıyorum. –

+0

Aslında, bence edsko'nun önerisiyle gitmelisin. Kodundaki "if" koşulu doğru olduğunda, istediğiniz mülke sahip olan tüm örnekleri toplayacak olan varlık açıklamasına sahip olursunuz.Sadece bu tanımla ilgili bir açıklama yapmadan, bir yüklem yapmadan ve orada olursun. Bunun güzelliği, yalnızca söz konusu mülk için belirli değerlere sahip örneklere ihtiyacınız varsa, bunlar için getirme için bir yük ekleyebiliriz. (İkinize de teşekkür ederim: Doğruca anneden çok fazla bilgi alabileceğinin farkında değildim.) – Wienke

+0

Eğer peşinde performansınız varsa, belki de veritabanı modelinizi yeniden düşünmelisiniz. Çekirdek Veriler, farklı varlıkları farklı veritabanı tablolarında depolar; böylece, varlıklar arasında çalışan karmaşık bir sorguyla karşılaşsanız bile, muhtemelen çok iyi performans göstermez. Belki de mülkün ana varlığa eklenmesinden daha iyidir ve buna ihtiyaç duymayan alt birimlerde kullanılmasını bırakın. – edsko

1

İlginç soru.

Ben yönetilen bir nesne üzerinde bu yüklemi çalıştı:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”]; 

Ama bu hata var: SQL kazmak hazır olmadığını “yüklemi için uygulanmamış SQL üretimi.”

bana önerir NSArrays, NSEntityDescription öznitelik adlarını sorgulayarak aldığınız şeydir. bir varlık named ve to- attr tek dize vardır Namer Define

: başka kimse doğrudan getirme isteği yoluyla istediğini yapacak bir yüklemi ile gelip Eğer

, bu geçici çözümü öneririm Bir çok ilişki members. Hedef çocuk varlığınızın sahip olabileceği olası özelliklerin her biri için bunlardan birini oluşturun. Sonra çocuk namers denilen Namer bir-çok ilişki (members ilişkinin ters) entites verir. Ekleme üzerine, bu ilişkiye uygun "adlar" ekleyin.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought]; 
// ("namerSought" is an instance of Namer.) 
+0

var. Ana varlıkta tanımlanmayan öznitelikleri kullanmaya çalıştığımda beğenmedim. Ayrıca, burada anlattığınız gibi neredeyse bir yaklaşım kullanmaya karar verdim. Bu kesinlikle ideal bir çözüm değildir ve umarım birileri hala bilmediğimiz bir hileyi bilebilir. Aksi halde bunu bir gün ya da daha sonra cevaplandıracağım. Teşekkürler. –

İlgili konular