En iyi pratik? - Temel Veri Varlığı Özelliği Olarak Dizi / Sözlük [kapalı]


176

Core Data'da yeniyim. Koleksiyon türlerinin öznitelik türleri olarak mevcut olmadığını ve bir öznitelik olarak dizi / sözlük türü verilerini depolamanın en etkili yolunun ne olduğunu bilmek istediğini fark ettim (örneğin, cadde, şehir gibi bir adresi oluşturan öğeler ayrı bir varlık gerektirmez ve ayrı özniteliklerden / alanlardan daha kolay bir sözlük / dizi olarak depolanır). Teşekkür ederim.


6
Adres için dize alanlarına sahip bir varlık oluşturmak, muhtemelen anahtarlarınızı hatırlamanız gereken bir sözlükten daha kolaydır ...
Daniel

Yanıtlar:


247

Temel Verilerde "yerel" bir dizi veya sözlük türü yoktur. Dönüştürülebilir bir öznitelik olarak bir NSArrayveya bir kaydedebilirsiniz NSDictionary. Bu NSCoding, diziyi veya sözlüğü bir NSDataözniteliğe serileştirmek (ve erişim üzerine uygun şekilde serisini kaldırmak için ) öğesini kullanır. Bu yaklaşımın avantajı kolay olmasıdır. Dezavantajı, diziye veya sözlüğe (veri deposunda bir BLOB olarak depolanır) sorgulayamamanız ve koleksiyonlar büyükse, veri deposuna / veritabanından çok fazla veri taşımanız gerekebilir (eğer SQLite veri deposu) yalnızca koleksiyonun küçük bir bölümünü okumak veya değiştirmek için.

Bunun alternatifi, dizi veya sözlük koleksiyonunun anlambilimini modellemek için Temel Verileri birçok ilişkide kullanmaktır. Diziler daha kolaydır, bu yüzden bununla başlayalım. Çekirdek Veriler-çok sayıda ilişki gerçekten bir seti modelliyor, bu nedenle dizi benzeri işlevselliğe ihtiyacınız varsa, kümeyi sıralamanız gerekir (getirilen bir özelliği kullanmak bunu yapmak için uygun bir yoldur) veya varlığa fazladan bir dizin özelliği eklemeniz gerekir dizi öğelerini depolar ve dizinleri kendiniz yönetir. Homojen bir dizi saklıyorsanız (tüm girişler aynı türdeyse), dizi varlıkları için varlık açıklamasını modellemek kolaydır. Değilse, öğe verilerini depolamak veya bir öğe öğeleri ailesi oluşturmak için dönüştürülebilir bir özellik kullanıp kullanmayacağınıza karar vermeniz gerekir.

Bir sözlüğü modellemek, büyük olasılıkla bir anahtar ve değer depolayan bir varlık kümesiyle çok sayıda ilişki gerektirecektir. Hem anahtar hem de değer, yukarıda açıklanan dizi için öğe varlığına benzer. Bu yüzden ya yerel türler (bunları önceden biliyorsanız), dönüştürülebilir bir öznitelik veya türe özgü varlıklar ailesinden bir örnekle ilişki olabilir.

Eğer bunlar kulağa biraz korkutucu geliyorsa, öyle. Temel veriler gibi şemaya bağlı bir çerçeveye keyfi veri eklemek zordur.

Adresler gibi yapılandırılmış veriler için, varlıkların açıkça modellenmesi için zaman harcamak neredeyse her zaman daha kolaydır (örneğin, adresin her bölümü için bir özellik). Bir sözlüğü modellemek için tüm ekstra kodlardan kaçınmanın yanı sıra, bu, kullanıcı arayüzünüzü kolaylaştırır (bağlamalar "sadece çalışır") ve doğrulama mantığınız vb.Çok daha fazla Çekirdek Veri tarafından işlenebildiğinden daha açıktır.

Güncelleme

OS X 10.7'den itibaren Temel Veriler, bir dizi yerine kullanılabilen sıralı bir set türü içerir. 10.7 veya üstünü hedefleyebiliyorsanız, bu, sıralı (dizi benzeri) koleksiyonlar için en iyi çözümdür.


İkincisi - zaten düşündüğümü doğruladım ama dönüştürülebilir nitelikleri bilmiyordum.
jkp

3
@pixelfreak Dönüştürülebilir kullanımı, koleksiyondaki öğeleri nasıl kullanmanız gerektiğine bağlıdır . Onlara karşı sorgulamanız gerekiyorsa veya bunlardan bazılarını veya tümünü tembel olarak yükleyebilmek istiyorsanız, dönüştürülebilir bir özellik çalışmaz. Tembel yüklemeye ihtiyacınız yoksa, sorgulamanıza ve her zaman tüm öğelere veya hiçbirine ihtiyacınız yoksa, dönüştürülebilir bir özellik sizin için işe yarayabilir (ve kesinlikle uygulanması kolaydır).
Barry Wark

3
Barry'nin söyledikleri, Temel Veri Programlama Kılavuzu, Standart Dışı Kalıcı Özellikler bölümünde daha ayrıntılı olarak açıklanmaktadır .
Palimondo

2
Sıralı setler hakkında bir uyarı notu: bunları, birçok tarafta birkaç binden fazla nesne ile çok sayıda ilişki için kullanmayın. Bunu yaparsanız, kaydetme işlemi iş parçacığını engelleyecek kadar uzun sürebilir.
Kirk van Gorkom

2
"Yeni sipariş seti" hakkında anlamıyorum. Bir özellik midir? Çünkü öznitelik türü menüsünde göremiyorum.
Plot

11

Benzer bir sorunum vardı. Benim durumumda, bir dizi dizeyi eşlemek istedim. Barry'nin tavsiyelerine uydum ve sonunda işe koyuldum. İşte kodun bir kısmı neye benziyor (umarım bu şekilde çalışan herkes için bir şeyler açıklığa kavuşur) ...

Benim Varlığım şuna benzer:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

Nesne Model Kodunu Yönet (Temel Veriler) kodu şuna benzer:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];    
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];

[entityDescription setProperties:appointmentSearchResponseProperties];

Yani buradaki anahtar öğeler:

  • Özellik türü için bir NSSet kullanıyorum
  • Temel Veri Yönetilen Nesne Modeli öznitelik türü olarak NSTransformableAttributeType kullanıyorum.

Yani bu kodu bir init yöntemi içinde AppointmentSearchResponse.m içine koyar mıydınız?
Chicowitz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.