NSManagedObject के विशिष्ट उपवर्ग को खोजने में असमर्थ


136

मैं कोर डेटा के साथ एक ऐप विकसित करने पर काम कर रहा हूं। जब मैंने एक उदाहरण बनाया है:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)

मुझे लॉग इन करने की चेतावनी मिली:

CoreData: warning: Unable to load class named 'User' for entity 'User'.  Class not found, using default NSManagedObject instead.

मैं इसे कैसे ठीक कर सकता हूं?

और एक और सवाल, मैं NSManagedObject उपवर्ग में एक आवृत्ति विधि को कैसे परिभाषित कर सकता हूं?

संपादित करें:

मैंने निम्नलिखित स्क्रीनशॉट के रूप में इकाई का वर्ग निर्दिष्ट किया है:

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


7
क्या आपने मॉड्यूल नाम के साथ संस्थाओं के नाम को प्रीफ़ाइंड किया है, जैसा कि कोर डेटा प्रबंधित ऑब्जेक्ट उपवर्गों में लागू किया गया है ?
मार्टिन आर

@MartinR: मेरे प्रश्न का अद्यतन देखें।
MsrButterfly

2
वर्ग "YourAppName.User" होना चाहिए, दस्तावेज देखें (मेरी पिछली टिप्पणी में लिंक)।
मार्टिन आर

@MartinR: आपकी मदद के लिए धन्यवाद। यह काम करता हैं।
Msrutterfly

सबसे अच्छी बात यह है कि उन कक्षाओं को हटा दें और इसे बनाएं। यह मेरे लिए काम किया
अभिषेक

जवाबों:


220

Xcode 7 (अंतिम) के लिए अद्यतन: मॉड्यूल नाम को कक्षा में भेजना (Xcode 6 में और Xcode 7 के शुरुआती बीटा रिलीज़ के रूप में) अब आवश्यक नहीं है। मुख्य डेटा प्रबंधित ऑब्जेक्ट उपवर्गों को लागू करने वाला Apple दस्तावेज़ तदनुसार अद्यतन किया गया है।

डेटा मॉडल इंस्पेक्टर के पास अब दो फ़ील्ड हैं "क्लास" और एक इकाई के लिए "मॉड्यूल":

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

जब आप इकाई के लिए एक स्विफ्ट प्रबंधित ऑब्जेक्ट उपवर्ग बनाते हैं, तो "मॉड्यूल" फ़ील्ड "वर्तमान उत्पाद मॉड्यूल" पर सेट होती है, और इस सेटिंग के साथ इंस्टेंस बनाने के लिए मुख्य एप्लिकेशन और यूनिट परीक्षणों दोनों में काम होता है। प्रबंधित ऑब्जेक्ट उपवर्ग को चिह्नित नहीं किया जाना चाहिए @objc(classname)(यह https://stackoverflow.com/a/31288029/1187871515 में देखा गया था )।

वैकल्पिक रूप से, आप "मॉड्यूल" फ़ील्ड को खाली कर सकते हैं (यह "कोई नहीं" दिखाएगा) और प्रबंधित ऑब्जेक्ट उपवर्गों को चिह्नित करें @objc(classname)(यह https://stackoverflow.com/a/31287260/1187415 में देखा गया था )।


टिप्पणी: यह उत्तर मूल रूप से Xcode 6 के लिए लिखा गया था। इस समस्या के संबंध में विभिन्न Xcode 7 बीटा रिलीज़ में कुछ बदलाव किए गए थे। चूंकि यह कई upvotes और इसके लिंक के साथ एक स्वीकृत उत्तर है, इसलिए मैंने वर्तमान Xcode 7 संस्करण के लिए स्थिति को संक्षेप में प्रस्तुत करने की कोशिश की है।

मैंने अपना "शोध" दोनों किया और इस प्रश्न के सभी उत्तर और इसी तरह के प्रश्न को कोरडाटा: चेतावनी: नाम से लोड करने में असमर्थ । इसलिए उनमें से सभी के लिए एट्रिब्यूशन जाता है, भले ही मैं उन्हें विशेष रूप से सूचीबद्ध न करूँ!


Xcode 6 के लिए पिछला उत्तर :

जैसा कि मुख्य डेटा प्रबंधित ऑब्जेक्ट उपवर्गों में लागू किया गया है, आपको अपने मॉड्यूल के नाम के साथ मॉडल इकाई निरीक्षक में क्लास फ़ील्ड में संस्थाओं के नाम को उपसर्ग करना होगा, उदाहरण के लिए "MyFirstSwiftApp.User"।


2
यह एक मेरे लिए काम कर रहा है। प्रश्न: क्या होगा यदि कोर डेटा को एक फ्रेमवर्क में शामिल किया गया है, तो प्रबंधित प्रबंधित उप-नाम का उपसर्ग कैसे करें क्योंकि अभी तक कोई वास्तविक ऐप नहीं है?
एलन मकाटिंगराव

9
@ एलन: आप @objc(ClassName)क्रिस्टर के उत्तर में सुझाई गई विधि को आजमा सकते हैं ।
मार्टिन आर।

8
यह काम करता है, लेकिन एक बार जब मैंने इकाई निरीक्षक में "APPNAME.User" वर्ग का नाम सेट कर दिया है, तो मैं मॉडल कक्षाओं को पुनर्जीवित करने में असमर्थ हूं: Xcode उपसर्ग से भ्रमित होने लगता है, और यह नाम के साथ एक फ़ाइल / वर्ग उत्पन्न करता है एप्लिकेशन का नाम। क्या मैं कुछ भूल रहा हूँ?
पास्कल बॉर्क

1
स्थैतिक पुस्तकालय में कोर डेटा का उपयोग करते समय यदि आपको Objective-C में यह त्रुटि मिलती है तो क्या होगा?
जॉर्ज टास्क

1
@ अनुराग: मैंने अब अंत में उत्तर को अपडेट कर दिया है, मुझे उम्मीद है कि अब सब कुछ सही है।
मार्टिन आर।

62

बस एक साइड-नोट के रूप में। मेरी भी यही समस्या थी। और मुझे केवल इतना करना था कि मैं @objc(ClassName)अपनी कक्षा की फाइल में जोड़ दूं।

उदाहरण:

@objc(Person)
class Person { }

और इससे मेरी समस्या हल हो गई।


1
आपने उस तरीके से ऑब्जेक्टिव-सी में टाइपेलियास (<% प्रोजेक्टनेम%> व्यक्ति -> व्यक्ति) को परिभाषित किया है, इसलिए यह काम करता है।
MsrButterfly

लगता है जैसे Apple इसे पूरी तरह से स्विफ्ट में बदलना भूल गया .. न जाने क्यों, लेकिन इसने मेरे लिए इसे बहुत धीरे से तय किया
Jiáí Zahálka

7
यह विशेष रूप से उपयोगी है यदि आपके पास कई लक्ष्यों के साथ एक परियोजना है, जहां प्रत्येक लक्ष्य CoreData मॉडल साझा करता है। इन मामलों में, लक्ष्य पहचानकर्ता के साथ वर्ग नाम को उपसर्ग करना संभव नहीं है क्योंकि यह सीडी मॉडल को केवल एक लक्ष्य के लिए उपयोगी प्रदान करता है।
djbp

@djbp और "क्यों नहीं?" मैं जानना चाहता हूं। मुझे नामस्थान की अवधारणा पसंद है, लेकिन इससे मुझे अपना मैकबुक खिड़की से बाहर फेंकना पड़ा (मेरे पास एक्सटेंशन वाला ऐप है, और एक्सटेंशन चलाते समय इस समस्या को मारा)। नामस्थान के साथ ऐसा करने का एक "सही" तरीका होना चाहिए, मैं अभी इसका पता नहीं लगा सकता।
S'pht'Kr

यूप ने मेरे लिए यह काम किया जब एक कार्यक्षेत्र में साझा डेटा मॉडल के साथ काम करते हुए
naz

31

इस प्रश्न के स्वीकृत उत्तर ने मुझे उसी मुद्दे को हल करने में मदद की, लेकिन मेरे पास एक चेतावनी थी कि मुझे लगा कि यह दूसरों के लिए उपयोगी होगा। यदि आपके प्रोजेक्ट (मॉड्यूल) के नाम में एक जगह है, तो आपको एक अंडरस्कोर के साथ अंतरिक्ष को बदलना होगा। उदाहरण के लिए:

इकाई: MyEntity क्लास: My_App_Name.MyClass


बिल्कुल वही जो मैं ढूंढ रहा था! चीयर्स!
मनोसिम

जब हम क्लास का नाम AppName.ClassName के साथ सेट करते हैं, तो Xcode 9 इसकी डॉट को हटा देता है और बिना डॉट के क्लास बनाता है। तो यह अब Xcode 9. * में नहीं है।
yo2bh


9

निर्भर करता है अगर आप ऐप बनाम टेस्ट के रूप में चल रहे हैं तो समस्या यह हो सकती है कि ऐप की तलाश है <appName>.<entityName>और जब यह परीक्षण के रूप में चल रहा है तो यह दिख रहा है <appName>Tests.<entityName>। इस समय (Xcode 6.1) जो समाधान मैं उपयोग कर रहा हूं Class, वह CoreData UI में फ़ील्ड नहीं भरना है , और इसके बजाय कोड में करना है।

यह कोड पता लगाएगा कि क्या आप ऐप बनाम टेस्ट के रूप में चल रहे हैं और सही मॉड्यूल नाम का उपयोग करें और अपडेट करें managedObjectClassName

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional...
    let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")!
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    // Check if we are running as test or not
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

    // Create the module name
    let moduleName = (isTest) ? "StreakTests" : "Streak"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    return newManagedObjectModel
}()

1
मैंने आपके समाधान की कोशिश की, लेकिन मुझे "घातक त्रुटि मिल रही है: NSArray तत्व Swift Array Element प्रकार से मेल करने में विफल रहा" जब NSManagedObject को उसके वास्तविक वर्ग में डाला गया। वास्तव में जब खुद कास्टिंग नहीं होती है, लेकिन जब लूप में जाने की कोशिश की जाती है।
रोड्रिगो रुइज़

1
यदि आपके मॉडल में किसी प्रकार की विरासत है तो वह उदाहरण काम नहीं करता है। प्रत्येक नई इकाई के लिए आपको उप-संचालकों पर पुनरावृति करने और आपके द्वारा बनाई गई नई संस्थाओं के साथ अपडेट करने की भी आवश्यकता है।
एंटोन

8

यदि आप "My-App" जैसे अपने प्रोजेक्ट नाम में एक हाइफ़न का उपयोग कर रहे हैं, तो "My_App.MyManagedObject" जैसे हाइफ़न के बजाय एक अंडरस्कोर का उपयोग करें। सामान्य तौर पर, xcdatamodeld फ़ाइल का नाम देखें और उस नाम के समान उपसर्ग का उपयोग करें। Ie "My_App_1.xcdatamodeld" को उपसर्ग "My_App_1" की आवश्यकता होती है


1
वाह। धन्यवाद धन्यवाद धन्यवाद। मुझे यह जानने में दिलचस्पी होगी कि Apple डॉक्स में कहाँ है कि छोटी डली है :)
nh32rg

5

यह उसी समस्या का अनुभव करने वालों की मदद कर सकता है। मैं स्विफ्ट 2 और एक्सकोड 7 बीटा 2 के साथ था।

मेरे मामले में समाधान में टिप्पणी करना @objc(EntityName)था EntityName.swift


3

मेरे पास एक ही चेतावनी थी, हालांकि मेरा ऐप ठीक चल रहा था। समस्या यह थी कि जब संपादक चल रहा था> अंतिम स्क्रीन पर NSManagedObject Subclass बनाएँ, मैंने डिफ़ॉल्ट समूह स्थान का उपयोग किया था, जिसमें कोई लक्ष्य प्रदर्शित या जाँच नहीं की गई थी, जो कि उप-वर्ग को MyApp.xcodeproj पर स्थित शीर्ष MyApp निर्देशिका में सहेजा गया था।
चेतावनी तब चली गई जब मैंने इसके बजाय समूह को MyApp सबफ़ोल्डर में बदल दिया और MyApp लक्ष्य की जाँच की।


2

उपरोक्त उत्तर सहायक थे। यह त्वरित स्वच्छता जांच आपको कुछ समय बचा सकती है। प्रोजेक्ट> बिल्ड फेज> कंपाइल सोर्स में जाएं और अपने xcdatamodeld और अपने मॉडल की फाइलों को "-" बटन के साथ हटा दें, और फिर "+" बटन के साथ उन्हें वापस जोड़ें। पुनर्निर्माण - इसका ख्याल रख सकते हैं।


2

वैसे, जो आप उपसर्ग के रूप में जोड़ते हैं, उसे ध्यान में रखें: मेरे ऐप को "एबीसी-डीईएफ़" कहा जाता है और एक्सकोड ने "-" को "_" में बदल दिया है।

खोजक में सुरक्षित रूप से देखने के लिए, अपने प्रोजेक्ट फ़ाइलों को देखें और देखें कि यह आपके डेटा मॉडल के लिए क्या कहता है (उदाहरण के लिए "ABC_def.xcdatamodeld") और वहां जो कुछ भी लिखा है उसका उपयोग करें !!!


1

उपरोक्त उत्तरों से मुझे उद्देश्य-सी से जुड़े विभिन्न मुद्दों को हल करने में मदद मिली (शायद यह किसी की मदद करेगा):

यदि आपने इकाई नाम वापस कर दिए हैं, तो "उपयोगिताएँ पैनल" में "क्लास" को भी बदलना न भूलें।


0

उपरोक्त जवाबों ने मेरी मदद की लेकिन यह किसी की मदद कर सकता है। अगर मेरी तरह आप उन्हें किया और अभी भी एक समस्या है, बस 'अपनी परियोजना को साफ' करने के लिए याद रखें। XCode8 के लिए, उत्पाद> स्वच्छ। फिर चला।


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