CoreData: चेतावनी: नामित वर्ग लोड करने में असमर्थ


94

मैं Xcode 6.1 का उपयोग करते हुए एक नए स्विफ्ट संस्करण के लिए एक मौजूदा ऑब्जेक्टिव-सी टीवी शो ऐप को डुप्लिकेट कर रहा हूं और CoreData के साथ कुछ समस्याएं आ रही हैं।

मैंने 4 संस्थाओं का एक मॉडल बनाया है, उनके NSManagedObject उपवर्ग (स्विफ्ट में) का निर्माण किया है, और सभी फाइलों में उचित एप्लिकेशन लक्ष्य निर्धारित हैं ('संकलन स्रोत')।

जब भी मैं एक नई इकाई सम्मिलित करने का प्रयास करता हूँ तो मुझे यह त्रुटि मिलती है:

कोरडाटा: चेतावनी: इकाई 'शो' के लिए 'शो' नामक वर्ग को लोड करने में असमर्थ। इसके बजाय डिफ़ॉल्ट NSManagedObject का उपयोग करके कक्षा नहीं मिली।

कुछ टिप्पणियाँ:

कोर डेटा की बचत करते समय, मैं बैकग्राउंड थ्रेडिंग की अनुमति देने के लिए पेरेंट-चाइल्ड संदर्भ तरीके का उपयोग करता हूं। मैं इसका उपयोग करके ManagedObjectContext की स्थापना करके करता हूं:

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()

और डेटा का उपयोग करके बचत करके:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
  var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
  context.parentContext = self.managedObjectContext!
  ...rest of core data saving code here...
})

जवाबों:


177

यह चेतावनी उन झगड़ों में से एक है, जिनसे हमें निपटना है, जबकि स्विफ्ट कार्यान्वयन के विवरणों पर विचार किया जा रहा है। चेतावनी स्वाभाविक रूप से होती है, अर्थात आपका सेटअप नीचे दिए गए चरणों का पालन न करने पर भी काम कर सकता है।

मैं ज्यादातर मामलों में यह सुनिश्चित करने में सफल रहा कि मॉडल संपादक में कक्षा सही ढंग से सेट की गई है । कई अन्य एसओएफ पोस्ट (इस प्रश्न के उत्तर सहित) के विपरीत, मॉड्यूल नाम (जैसे MyApp.Shows) को शामिल करने के सुझाव ने मेरी मदद नहीं की है।

सुनिश्चित करें कि आप इन तीन वस्तुओं की जाँच करते हैं:

1.
संस्करण जो Xcode 7 बीटा 3 तक काम करता है

XCode7 b3 तक

ध्यान दें कि मैंने आपकी इकाई का नाम अधिक उपयुक्त एकवचन में सुधारा।

संस्करण जो Xcode 7.1 में स्विफ्ट 2.0 के लिए काम करता है
(Xcode 7 बीटा 4 और इसके बाद के संस्करण के लिए काम करना चाहिए)

आपको मॉड्यूल में "वर्तमान उत्पाद मॉड्यूल" पाठ को हटाने की आवश्यकता है!

Xcode7 बीटा 3 से

2.
शामिल करने के लिए आपको लगातार सिफारिश का भी पालन करना चाहिए

@objc(Show)

अपनी कक्षा के ठीक ऊपर।

नोट : यदि आप Xcode 7 बीटा 4 या उसके बाद का उपयोग कर रहे हैं, तो यह कदम वैकल्पिक है।

3.
यह भी सुनिश्चित करें कि बनाए गए ऑब्जेक्ट को उचित वर्ग में डालना सुनिश्चित करें , क्योंकि डिफ़ॉल्ट बस होगा NSManagedObject

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", 
                 inManagedObjectContext: context) as Show

3
धन्यवाद! मैंने अनुशंसित नामकरण सम्मेलन अपडेट किया, और यह '@objc (शो)' था, जो 'क्लास लोड करने में असमर्थ ...' त्रुटि को ठीक करने में चाल करने के लिए लगता है। बहुत सराहना की!
जिम्मीजैम

हाय @ मुंडी। आपको बहुत - बहुत धन्यवाद! क्या आपको अब भी याद होगा कि स्रोत कहां था?
14:मदविदलाम

1
उदाहरण के लिए देखें यह प्रश्न । वहाँ क्या हो रहा है यह समझने के लिए पर्याप्त जानकारी है।
मुंडी

4
दिलचस्प रूप से पर्याप्त, मुझे हटाना पड़ा@objc(MyClass)
सांता क्लॉस

1
@ मुंडी, आप अपने उत्तर को फिर से अपडेट करना चाह सकते हैं। देखिए खुनशान का जवाब अपडेट
सुरगाछ

75

स्विफ्ट 2 / XCODE 7 अपडेट:

यह समस्या (इस उत्तर पर मेरी 3 अप्रैल की टिप्पणी भी देखें) को स्विफ्ट 2 और ऐप्पल द्वारा एक्सकोड 7 बीटा रिलीज़ में हल किया गया है। तो अब आपको वास्तव में स्विफ्ट की आवश्यकता नहीं है जैसा कि मुंडी द्वारा उत्तर दिया गया है या आपके क्लास नाम से पहले " " का उपयोग कर रहा है । यह काम करना बंद कर देगा। तो इन्हें हटा दें, बस फ़ाइल में नाम डालें और मॉड्यूल और चियर्स के रूप में चुनें !@objc(myEntity)MyAppName.ClassCurrent Working Module

वर्तमान काम कर रहे मॉड्यूल का चयन करना

लेकिन @objc(myEntity)स्विफ्ट (मेरे जैसे) में उपयोग करने वालों के लिए , आप इसके बजाय अन्य समाधान का उपयोग कर सकते हैं जो आसानी से काम करता है।

में xcdatamodel सही वर्ग। यह इस तरह दिखना चाहिए:

कक्षा की स्थापना

हेयर यू गो। Module.ClassSwift और XCode में CoreData के लिए पैटर्न 6. मॉडल पॉलिसी या अन्य CoreData सामान में कस्टम पॉलिसी वर्ग का उपयोग करते समय आपको उसी प्रक्रिया की भी आवश्यकता होगी । एक नोट: छवि में, नाम और वर्ग कार और MyAppName.Car (या जो भी आपकी इकाई का नाम है) होना चाहिए। यहाँ, Userएक टाइपो है।


इस समाधान के साथ समस्या यह है कि ऑटो उत्पादक इकाई वर्ग अब ठीक से काम नहीं करेगा (यह मॉड्यूल नाम के साथ केवल एक वर्ग उत्पन्न करेगा)। देखें: बनाएँ NSManagedObject उपवर्ग ठीक से उत्पन्न नहीं
मीलो

NSManagedObject निकाय कक्षाओं को बनाने के बाद आपको समाधान लागू करने की आवश्यकता है। संभवतः एक एक्सकोड 6.xx बग को हटाया जाना है।
खुनशान

2
हां, यह निस्संदेह हल हो जाएगा। ऑटो जेनरेट की गई कक्षाओं को पहले से ही @objc (<वर्ग का नाम जैसे कि इंस्पेक्टर इंस्पेक्टर में दर्ज किया गया है) के साथ सजी होना चाहिए या, अधिक संभावना है, Apple के साथ शुरू करने के लिए यह अनावश्यक बना देगा।
मील

2
अभी भी लोग इसे पढ़ रहे हैं। ' MyAppName.Car ' का उपयोग करने से मेरे लिए काम नहीं किया, यह तब काम किया जब मैंने ' MyAppName ' को हटा दिया ' अंश। तो बस Carदोनों क्षेत्रों के लिए चाल चली।
गिदोन

1
आप चैंपियन !!!! let person = NSEntityDescription.insertNewObject (forEntityName: "व्यक्ति", में: संदर्भ) के रूप में! व्यक्ति
अभिमन्यु राठौर

36

Xcode 7 और विशुद्ध रूप से स्विफ्ट का उपयोग करते समय, मुझे वास्तव में अपने ऑटो-जेनरेट किए गए उपवर्ग ( > से उत्पन्न ) को हटाना पड़ा ।@objc(MyClass)NSManagedObjectEditorCreate NSManagedObject Subclass...


4
वाह इस उत्तर को पोस्ट करने के लिए धन्यवाद। मैं दीवार के खिलाफ अपना सिर पीटने लगा।
जिया

यहाँ एक ही मुद्दा - एक बग प्रस्तुत किया।
MirekE

मेरे लिए भी काम किया। उसे निकालना था। विचित्र।
कैंट

मेरे प्रयोगों के अनुसार यह एक झूठी सकारात्मक की तरह दिखता है।
मुंडी

मुझे इसे हटाना पड़ा और करंट प्रोडक्ट मॉड्यूल सेट करना पड़ा, तभी इसने काम किया
ओलेग शर्मन

13

Xcode 7 बीटा 2 में (और मेरा मानना ​​है कि 1), मॉडल कॉन्फ़िगरेशन में एक नया प्रबंधित ऑब्जेक्ट प्रकार Fileमॉड्यूल पर सेट है Current Product Moduleऔर ऑब्जेक्ट का वर्ग कॉन्फ़िगरेशन में दिखाया गया है .File

प्रबंधित ऑब्जेक्ट प्रकार का मॉड्यूल Xcode 7 में "वर्तमान उत्पाद मॉड्यूल" पर सेट है

मॉड्यूल सेटिंग को हटाना इसलिए यह रिक्त है, या पूर्ण विराम को हटा रहा है, इसलिए कॉन्फ़िगरेशन में वर्ग का नाम सिर्फ Fileसमान कार्य हैं, क्योंकि प्रत्येक अन्य परिवर्तन का कारण बनता है। इस कॉन्फ़िगरेशन को सहेजने से वर्णित त्रुटि दूर हो जाएगी।

प्रबंधित ऑब्जेक्ट का मॉड्यूल Xcode 7 में खाली होना चाहिए


9

Xcode 6.1.1 में आपको @objc विशेषता को जोड़ने की आवश्यकता नहीं है क्योंकि आधार इकाई एक objc वर्ग (NSManagedObject) का सबसेट है ( स्विफ्ट प्रकार संगतता देखें । CoreData में पूर्ण मॉड्यूल .Class नाम की आवश्यकता है। मॉड्यूल के बारे में जानें। नाम वह है जो बिल्ड सेटिंग्स में सेट किया गया है -> पैकेजिंग -> उत्पाद मॉड्यूल नाम। डिफ़ॉल्ट रूप से यह $ (PRODUCT_NAME: c99extidentifier) ​​पर सेट किया जाता है जो लक्ष्य का नाम होगा


हाँ! यह आधुनिक उत्तर है (xcode 6.3.2)। सही बंडल नाम का उपयोग करना महत्वपूर्ण है। मेरे मामले में, यह में तब्दील हो my-productगया था my_product, और इससे कोर डेटा पर सारा फर्क पड़ा ।
सिंपलीजी

5

XCode 7 और Swift 2.0 संस्करण के साथ, आपको @objc (NameOfClass) जोड़ने की आवश्यकता नहीं है, बस नीचे दिए गए "डेटा मॉडल निरीक्षक दिखाएँ" टैब में इकाई सेटिंग्स बदलें -

नाम - "आपका इकाई नाम"

वर्ग - "आपका इकाई नाम"

मॉड्यूल - "वर्तमान उत्पाद मॉड्यूल"

यहां छवि विवरण दर्ज करें

एंटिटी क्लास फाइल के लिए कोड इस प्रकार होगा (मेरे कोड में एंटिटी परिवार है) -

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}

यह उदाहरण xCode 7.0 + स्विफ्ट 2.0 के साथ मेरे ऐप में ठीक काम कर रहा है


3

PRODUCT_MODULE_NAMEअपने उत्पाद मॉड्यूल नाम के साथ प्रतिस्थापित करने के लिए मत भूलना ।

जब एक नई इकाई बनाई जाती है, तो आपको डेटा मॉडल इंस्पेक्टर (अंतिम टैब) पर जाने और PRODUCT_MODULE_NAMEअपने मॉड्यूल नाम के साथ प्रतिस्थापित करने की आवश्यकता होती है, या यह class not foundलगातार स्टोर समन्वयक बनाते समय एक त्रुटि का परिणाम देगा ।


2

आपको भी उपयोग करने की आवश्यकता है (कम से कम Xcode 6.3.2 के साथ) Module.Class जब उदाहरण के लिए अपने कलाकारों का प्रदर्शन करें: मान लें कि आपका मॉड्यूल (यानी उत्पाद का नाम) खाद्य है और आपकी कक्षा फल है

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)

let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit

संक्षिप्त:

  • डेटा मॉडल संपादक में इकाई को परिभाषित करते समय मॉड्यूल का नाम शामिल करें (नाम: फल, कक्षा: खाद्य। भर्ती)
  • जब कोड (यानी व्हाट्सएप) में इकाई को एक्सेस करते हैं, तो इसे Module.class (जैसे Food.Fruit) के साथ डालें।

धन्यवाद, दूसरा बिंदु बहुत महत्वपूर्ण है। मुझे इसे कास्टिंग करते समय "Module.Class" का उपयोग करना था।
ज़ॉयट


1

डेटा मॉडल संपादक में एंटिटी क्लास का नाम बदलकर प्रश्न के वर्ग के अनुरूप होना और @objc(NameOfClass)प्रत्येक NSManagedObject की फ़ाइल को कक्षा घोषणा के ठीक ऊपर जोड़ना यूनिट परीक्षण के दौरान मेरे लिए इस समस्या का हल हो गया।


0

मेरे लिए काम किया (Xcode 7.4, स्विफ्ट) वर्ग के नाम को बदल रहा है <my actual class name>.<entity name> इकाई निरीक्षक, 'क्लास' बॉक्स में ।

प्रबंधित ऑब्जेक्ट उपवर्ग का मेरा आरंभकर्ता, इस तरह दिखता है:

    convenience init(<properties to init>) {
    let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
    self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
    //init properties here

0

Xcode 11.5 के लिए: यदि कोडजेन संपत्ति वर्ग परिभाषा है, और यदि आपको xcdatamodel में बनाई गई इकाई के लिए कोई सुझाव नहीं मिल रहा है। Xcode छोड़ने और अपने प्रोजेक्ट को फिर से खोलने की कोशिश करें। इससे मेरा काम बनता है। यह उत्तर केवल तभी है जब आपको सुझाव नहीं मिल रहे हैं लेकिन यदि आपकी फ़ाइल उत्पन्न नहीं होती है तो उपरोक्त उत्तर की कोशिश करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.