6

मुझे कोर डेटा के साथ वायर्ड समस्या है। आईओएस 10 में Swift3 के साथ मैं प्रबंधित वस्तु संदर्भ हर बार मैं प्राप्त करने में कठिनाई हूँ याएक रिश्ते के लिए अस्वीकार्य प्रकार का मूल्य: संपत्ति = "उपयोगकर्ता"; वांछित प्रकार = उपयोगकर्ता; दिया गया प्रकार = उपयोगकर्ता;

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

मेरी ऐप्लिकेशन में साथ डेटा भंडारण मिल रहा दो संस्थाओं 'उपयोगकर्ता' और 'लेजर' की है। मैं किसी उपयोगकर्ता को खाताधारक असाइन करना चाहता हूं, लेकिन उपयोगकर्ता के पास एकाधिक लेजर हो सकते हैं। इसलिए, मेरे पास UserTableView है जहां मैं उपयोगकर्ता और UserViewController क्लास प्रदर्शित कर सकता हूं, जहां मैं उपयोगकर्ता बना सकता हूं। वही है जो मेरे पास है। एक खाता बनाने के दौरान मुझे उन सभी उपयोगकर्ताओं की एक सूची भी मिलती है, जिनसे मैं एक का चयन करता हूं और जिसे खाताधारक को सौंपा जाना चाहिए और इसके विपरीत।

जब ऊपर उल्लिखित की तरह बचत, मैं त्रुटि

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

मेरे डेटा मॉडल के रूप में निम्नानुसार लग रहा है मिल: Data Model

किसी भी मदद अत्यधिक सराहना की :)

+1

आप इस को हल किया? – Voltron

उत्तर

0

मैं इस एक ही समस्या थी। मेरे मामले में यह तब हो रहा था जब मैं यूनिट परीक्षण चला रहा था। उस स्थिति में, स्मृति में दो कोर डेटा स्टैक एक बार में थे, एक आवेदन दोहन के लिए और दूसरा मेरे चल रहे यूनिट परीक्षणों के लिए।

इसे सुलझाने का पहला संकेत रिश्ते की संपत्ति को स्थापित करने से पहले दावे को सही ढंग से रखना था ताकि यह सुनिश्चित किया जा सके कि जिस वस्तु का मैं सेटिंग कर रहा था वह इकाई के प्रकार के संबंध के समान था। वे समान होना चाहिए, और मेरे मामले में वे नहीं थे।

मेरे मामले में मैं एक MatchRequest कि Player "सर्जक" कहा जाता है के साथ एक-से-एक संबंध था। तो मेरी अभिकथन निम्नलिखित की तरह लग रहा था:

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 

ऊपर दावे विफल रहा है, जो मुझे लगता है कोर डेटा द्वारा इस्तेमाल किया दावा है कि तर्क अपवाद का कारण बनता है के समान है।

प्लेयर.एन्टिटी() का निरीक्षण करते समय, यह वही इकाई उदाहरण लौटाएगा जो विफलता का कारण बन रहा था।

मुझे लगता है कि समस्या की जड़ यह है कि कोर डेटा उन संस्थाओं के लिए कुछ स्थिर संपत्ति सेट कर रहा है जो कोर डेटा स्टैक्स में गलत तरीके से साझा किए जाएंगे। MyManagedObject.entity() को कॉल करना सही ढंग से काम करेगा जब एक स्टैक से बुलाया जाता है लेकिन दूसरा नहीं।

तो, समस्या के आसपास काम करने के लिए, जब मैं अपने प्लेयर ऑब्जेक्ट को रिलेशनशिप में डालता हूं, तो मुझे नए MyManagedObject(context:) कन्स्ट्रक्टर के बजाय पुरानी NSEntityDescription.insertNewObject(...) एपीआई का उपयोग करने वाली इकाई मिलती है। यह सुनिश्चित करता है कि दिए गए प्रबंधित ऑब्जेक्ट संदर्भ के लिए सही इकाई का उपयोग किया जाता है।

तो, संक्षेप में:

// 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 
संबंधित मुद्दे