2016-04-05 8 views
1

Veri modelimde birkaçdan çoğa ilişkisi var. Her durumda, modelden alınan verilerin sırasının, eklendiği sırayla eşleşmesi önemlidir. Her ilişki için müfettişte 'Siparişli' kutusunu işaretledim. Ben her zaman birden çok öğe ekleyebilir ve - bu iyi çalışıyor veri eklendiği Cihazda'yıÇekirdek Veri İlişkisi NSOrderedSet, her aygıtta farklı siparişi döndürüyor

NSOrderedSet *set = [sourceEntity valueForKey:relationshipKey]; 

:

NSMutableOrderedSet *set = [destinationEntity mutableOrderedSetValueForKey:relationshipKey]; 
[set addObject:sourceEntity]; 
[CoreDataFunctions saveEntity:destinationEntity]; 

şöyle ben sonradan setini almak şöyledir: I veri eklemek Doğru sırayla göster. Sorun, iCloud senkronizasyonu yoluyla veri alan cihazlarda, setin farklı bir sırayla döndürülmesidir. Her zaman aynı sipariş, ancak orijinal cihazda girilen aynı sırayla değil.

Bunu aşmak için, nesneleri kümeye yerleştirirken artan bir tam sayı ile doldurulan bir 'sipariş' özniteliği ekledim. Ardından, veriyi bu modelden aldıktan sonra bu anahtarla sıralayabilirim. Ancak, NSOrderedSet öngörülebilir bir sırada geri gelmezse, bir şeylerin yanlış olduğunu hissetmiyorum.

Bunun bir aygıt iCloud'dan işlemler aldığında günlüğünde gördüğüm bazı hatalarla ilgili olup olmadığını merak ediyorum. Ben muhtemelen bir kez her bir işlem için, aşağıdaki defalarca bakın:

*** ERROR: this process has called an NSArray-taking method, such as initWithArray:, and passed in an NSSet object. This is being worked-around for now, but will soon cause you grief.

Veri modelindeki nesnelerin türü NSSet vardır, ve Core Veri bir NSArray bekliyor şey için onları geçiyor çünkü bu olduğunu varsayalım. Bununla ilgili ne yapabileceğimi bilmiyorum, ya da bu sorunla bağlantılıysa. Çekirdek Verilerin NSOrderedSet'i bir NSArray'e dönüştürdüğünü ve bu sırada siparişin kaybedildiğini düşündüğümden de öyledir. Bunu teyit edemem.

Minnetle verilen herhangi bir öneri!

cevap

0

Bunu yapmanın en güvenilir yolu, veri modelinizdeki diğer her sınıfın ait olduğu gibi bir Abstract Entity oluşturmaktır. BaseEntity, NSManagedObject alt sınıfınızda awakeFromInsert olarak ayarlamış olduğunuz dateCreated özelliğine sahip olacaktır. Eğer bir getirme isteği gerçekleştirdiğinizde

Sonra bu SQLite kullanıyorsanız, özellikle oldukça hızlı olduğunu dateCreated kullanarak sıralamak için NSSortDescriptor belirtebilirsiniz.

Bunu yaparsanız, CoreData'daki ordered düğmesinin işaretini kaldırabilirsiniz.

DÜZENLEME: ilişki özelliğini oluşturulan

bir CoreData olan bir varlık Entity Verilen: İşte yönetilen bir nesne alt sınıfta ilişkileri sipariş bir örnektir

@property (nullable, nonatomic, retain) NSSet<Entity *> *toManyRelationship; 

Bundan sonra kendi özelliğini oluşturabilir:

@property (nullable, nonatomic, strong, readonly) NSArray<Entity *> *orderedToManyRelationship; 

Bu şöyle uygulanır:

@dynamic toManyRelationship; 

- (NSArray<Entity *> *)orderedToManyRelationship 
{ 
    NSSortDescriptor *dateSorter = [NSSortDescriptor sortDescriptorWithKey:@"dateCreated" ascending:YES]; 

    return [[self.toManyRelationship allObjects] sortedArrayUsingDescriptors:@[dateSorter]]; 
} 
+0

Hızlı cevabınız için teşekkür ederiz. Sadece birkaç soru.1, bu yaklaşım benim varlıklar için NSManagedObject alt sınıflarını kullanmak anlamına mı geliyor? Şu anda yardım yöntemleri ve KVC kullanıyorum, bu yüzden değerler ve kaydetme ayarları üzerinde daha fazla kontrole sahibim. Örneğin, bir varlığın anahtar/değeri ayarlamak ve sonra varlığı kaydetmek için yardımcı bir yöntemim var. İkincisi, bir getirme isteği kullanmadan ilişki kümeleri alırsam bu yaklaşım bir fark yaratır mı? Örn, doğrudan grubu içeren özniteliğe erişerek. Varsayımlar, eğer varlıklar hızlı bir şekilde oluşturulduysa (yani, birbirinin ikincisinden daha az bir süre içinde), işin yaratıldığı tarih olur mu? – mashers

+0

Tamam öylesine 1) Tüm varlıklarınız olmasa da, en basit yol, 'BaseEntity' öğesinin alt sınıfını çizmek olacaktır. Not: Alt sınıflandırma yararlı olabilir çünkü tip kontrolü ve IDE otomatik tamamlama elde edersiniz, sinir bozucu hatalardan tasarruf edin. 2) Eğer özniteliğe doğrudan erişirseniz, döndürülen nesnelere bir "sort descriptor" uygulamanız gerekir. (Eğer alt sınıf kullanıyorsanız, bunu sınıfın kendisinde yapabilirsiniz.) 3) Evet, "NSManagedObjectContext" 'e SİZİN YARATILIYORUZ. ” –

+0

Teşekkür ederiz @RASS, bu çok yardımcı oldu. Benim tasarruf stratejimin son derece verimsiz olduğunu fark ettim (temelde bir öznitelik değerinin her değiştiğinde bağlamı kaydetmesi ...) Şimdi sadece bir değişiklik saptandığında ve 2 saniyede bir kereden fazla kaydedilmeden zaman kazandıran bir zaman tasarrufu yöntemi uygulamıştım. Yönetilen nesne alt sınıflarını anlattığınız şekilde sorunla ilgili son derece mantıklı bir çözüm gibi görünün.Teşekkürler tekrar teşekkürler! – mashers

İlgili konular