6

Temel verilerle ilgili bir kablolu sorun yaşıyorum. iOS 10'da swift3 ile ben yönetilen nesne bağlamı ben getirmeyi veya benim appBire bir ilişki için kabul edilemez bir değer: property = "user"; istenen tip = Kullanıcı; verilen tip = Kullanıcı;

func getContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.persistentContainer.viewContext 
} 

ile veri depolamak ediyorum her zaman olsun ben iki tarafın Kullanıcı 've 'Ledger' var. Bir kullanıcıya bir muhasebeci atamak istiyorum, ancak bir kullanıcının birden fazla defteri olabilir. Bu nedenle, kullanıcı ve kullanıcı bir UserViewController sınıfını görüntüleyebileceğim bir UserTableView var. Aynı defter için bende var. Bir muhasebeci oluştururken, aynı zamanda, birini seçtiğim ve muhasebeye atanması gereken tüm kullanıcıların bir listesini de alırım. Bu aynı sorunu vardı Data Model

Herhangi bir yardım son derece takdir edilir :)

+1

Bunu çözmek mi? – Voltron

cevap

0

:

yukarıda belirtilen gibi tasarruf

, ben şöyle

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User; 

Benim veri modeli görünüyor hatası alıyorum. Benim durumumda, ünite testleri yaparken de oluyordu. Bu durumda, bir kerede bellekte iki temel veri yığını vardı, biri uygulama koşumuna ve diğeri de çalışan birim testlerim için.

Bunu çözümlemenin ilk ipucu, ayarlandığım nesnenin varlık türünün ilişkinin beklenen varlık türü ile aynı olduğundan emin olmak için ilişki özelliğini ayarlamadan önce bir onaylama hakkı vermekti. Aynı olmalılar ve benim durumumda değillerdi.

Benim durumumda "initiator" adlı Player ile bire bir ilişkisi olan bir MatchRequest vardı. Yani benim iddia aşağıdaki benziyordu:

let player = try Player.findLocal(for: matchRequest.initiator, in: moc, createIfMissing: true) 
    let expectedEntity = self.entity.relationshipsByName["initiator"]!.destinationEntity! 
    assert(player!.entity === expectedEntity, "Player returned doesn't have the same entity type") 
    self.initiator = player 

yukarıdaki iddia ı argüman duruma neden olur Çekirdek veri kullandığı iddiasına benzeyen şüpheli, hangi başarısız oldu.

Player.entity() öğesini denetlerken, hataya neden olan aynı varlık örneğini döndürür.

Sorunun kökü, Çekirdek Verilerinin temel veri yığınlarında yanlış şekilde paylaşılacak varlıklar için bazı statik özellikler ayarlaması olduğunu düşünüyorum. MyManagedObject.entity() yönteminin çağrılması, bir yığından çağrıldığında doğru şekilde çalışır, ancak diğerinden değil.

Bu nedenle, bu soruna geçici bir çözüm bulmak için Player nesneyi iliştirmek üzere, daha yeni MyManagedObject(context:) yapıcısından ziyade, eski NSEntityDescription.insertNewObject(...) API'yi kullanarak varlığı elde ediyorum. Bu, verilen yönetilen nesne bağlamında doğru varlığın kullanılmasını sağlar.

Yani, özetlemek gerekirse:

// SOMETIMES FAILS if you have more than one core data stack: 
result = Player(context: managedObjectContext) 

// ALWAYS WORKS: 
result = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedObjectContext) as? Player