এনএসম্যানেজডঅবজেক্টের নির্দিষ্ট সাবক্লাসটি খুঁজে পেতে অক্ষম


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.

আমি কীভাবে এটি ঠিক করতে পারি?

এবং অন্য একটি প্রশ্ন, আমি কীভাবে এনএসম্যানেজডঅবজেক্ট সাবক্লাসে একটি উদাহরণ পদ্ধতিটি সংজ্ঞায়িত করতে পারি?

সম্পাদনা:

আমি নিম্নলিখিত স্ক্রিনশটের মতো সত্তার শ্রেণি নির্দিষ্ট করেছি:

এখানে চিত্র বর্ণনা লিখুন


7
কোর ডেটা ম্যানেজড অবজেক্ট সাবক্ল্যাসি বাস্তবায়নের ক্ষেত্রে দলিল হিসাবে আপনি কী সত্ত্বার শ্রেণীর নামটি মডিউল নামের সাথে উপসর্গ করেছেন ?
মার্টিন আর

@ মার্টিনআর: আমার প্রশ্নের আপডেট দেখুন।
MsrButterfly

2
ক্লাসটি "আপনার অ্যাপনাম.উসুজার" হওয়া উচিত, ডকুমেন্টেশন দেখুন (আমার আগের মন্তব্যে লিংক)।
মার্টিন আর

@ মার্টিনআর: আপনার সহায়তার জন্য ধন্যবাদ এটা কাজ করে।
MsrButterfly

সর্বোত্তম বিষয় হ'ল সেই ক্লাসগুলি মুছে ফেলা এবং এটি আবার তৈরি করা। এটি আমার জন্য কাজ করেছে
অভিষেক

উত্তর:


220

এক্সকোড 7 (চূড়ান্ত) এর জন্য আপডেট: ক্লাসে মডিউলটির নাম প্রস্তুতকরণ ( এক্সকোড 6 এবং এক্সকোড 7 এর প্রাথমিক বিটা প্রকাশের মতো) আর দরকার নেই। অ্যাপল ডকুমেন্টেশন ইমপ্লিমেন্টিং কোর ডেটা ম্যানেজড অবজেক্ট সাবক্ল্যাসিস অনুযায়ী আপডেট করা হয়েছে।

ডেটা মডেল পরিদর্শকের এখন সত্তার জন্য দুটি শ্রেণি "শ্রেণি" এবং "মডিউল" রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

আপনি যখন সত্তার জন্য একটি সুইফ্ট পরিচালিত অবজেক্ট সাবক্লাস তৈরি করেন, "মডিউল" ক্ষেত্রটি "বর্তমান পণ্য মডিউল" তে সেট করা থাকে এবং এই সেটিংটি তৈরি করে উদাহরণগুলি মূল প্রয়োগ এবং ইউনিট পরীক্ষায় উভয়ই কাজ করে। পরিচালিত অবজেক্ট সাবক্লাস অবশ্যই চিহ্নিত করা উচিত নয়@objc(classname) (এটি https://stackoverflow.com/a/31288029/1187415 এ দেখা গেছে )।

বিকল্পভাবে, আপনি "মডিউল" ক্ষেত্রটি খালি করতে পারেন (এটি "কিছুই নয়" দেখায়) এবং পরিচালিত অবজেক্ট সাবক্লাসগুলি চিহ্নিত করতে পারেন (এটি https://stackoverflow.com/a/31287260/1187415 এ@objc(classname) দেখা গেছে )।


মন্তব্য: এই উত্তরটি প্রাথমিকভাবে Xcode 6 এর জন্য রচিত হয়েছিল এই সমস্যার সাথে সম্পর্কিত বিভিন্ন এক্সকোড 7 বিটা প্রকাশে কিছু পরিবর্তন হয়েছিল। যেহেতু এটি অনেকগুলি উত্স এবং এর লিঙ্কগুলির সাথে একটি স্বীকৃত উত্তর, তাই আমি বর্তমান এক্সকোড 7 চূড়ান্ত সংস্করণের জন্য পরিস্থিতি সংক্ষিপ্ত করার চেষ্টা করেছি।

আমি উভয়ই নিজের "গবেষণা" করেছি এবং এই প্রশ্নের উভয় উত্তর এবং একই ধরণের প্রশ্নের উত্তর পড়েছি কোরডাটা: সতর্কতা: নামযুক্ত শ্রেণি লোড করতে অক্ষম । সুতরাং আমি তাদের নির্দিষ্টভাবে তালিকাভুক্ত না করলেও এট্রিবিউটমেন্টগুলি তাদের সকলের কাছে যায়!


এক্সকোড 6 এর পূর্ববর্তী উত্তর :

কোর ডেটা ম্যানেজড অবজেক্ট সাবক্ল্যাসি বাস্তবায়নের নথি হিসাবে , আপনাকে ক্লাস ফিল্ডে সত্ত্বা শ্রেণীর নামটি আপনার মডিউলটির নাম সহ মডেল সত্তা পরিদর্শকের প্রিফিক্স করতে হবে, উদাহরণস্বরূপ "মাই ফার্স্টসুইফটএপ ইউজার"।


2
এই আমার জন্য কাজ করছে। প্রশ্ন: মূল তথ্যটি যদি কোনও ফ্রেমওয়ার্কে অন্তর্ভুক্ত করা হয়, তবে এখনও কোনও আসল অ্যাপ নেই বলে ম্যানেজডঅবজেক্ট সাবক্লাসের নামটি কীভাবে উপস্থাপন করবেন?
অ্যালান ম্যাকাটিংরাও

9
@ অ্যালান: আপনি ক্রিসারের @objc(ClassName)উত্তরে প্রস্তাবিত পদ্ধতিটি চেষ্টা করতে পারেন ।
মার্টিন আর

8
এটি কাজ করে, তবে একবার আমি সত্তা পরিদর্শকের ক্লাসের নামটি "APPNAME.User" তে সেট করে দিয়েছি, আমি মডেল ক্লাসগুলি পুনরায় তৈরি করতে অক্ষম: এক্সকোডটি উপসর্গ দ্বারা বিভ্রান্ত বলে মনে হয় এবং এটি নামের সাথে একটি ফাইল / শ্রেণি উত্পন্ন করে অ্যাপ্লিকেশন নাম. আমি কিছু অনুপস্থিত করছি?
পাস্কেল বার্ক

1
স্ট্যাটিক লাইব্রেরিতে মূল ডেটা ব্যবহার করার সময় আপনি যদি উদ্দেশ্যটি-সি-তে এই ত্রুটিটি পান তবে কী হবে?
জর্জ তাসকোস

1
@ সুরগাচ: আমি এখন অবশেষে উত্তর আপডেট করেছি, আমি আশা করি যে সবকিছু এখন ঠিক আছে।
মার্টিন আর

62

যেমন পার্শ্ব-নোট। আমারো একই ইস্যু ছিল. এবং @objc(ClassName)আমাকে যা করতে হয়েছিল তা হ'ল আমার ক্লাস ফাইলটিতে।

উদাহরণ:

@objc(Person)
class Person { }

এবং এটি আমার সমস্যা সমাধান করেছে।


1
আপনি টাইপালিয়াসকে (<% ProjectName%>। ব্যক্তি -> ব্যক্তি) সেভাবে উদ্দেশ্য-সিতে সংজ্ঞায়িত করেছেন, তাই এটি কার্যকর হয়।
MsrButterfly

দেখে মনে হচ্ছে অ্যাপল এটিকে পুরোপুরি দ্রুতগতিতে রূপান্তর করতে ভুলে গিয়েছে .. কেন জানি না তবে এটি আমার জন্য বেশ মৃদুভাবে স্থির করেছে
জিří জহালকা

7
এটি বিশেষত কার্যকর যদি আপনার একাধিক লক্ষ্যবস্তু নিয়ে একটি প্রকল্প থাকে, যেখানে প্রতিটি লক্ষ্যটি কোরেডাটা মডেল ভাগ করে। এই ক্ষেত্রে, লক্ষ্য শনাক্তকারীর সাথে শ্রেণীর নাম উপস্থাপন করা সম্ভব নয় কারণ এটি সিডি মডেলকে কেবলমাত্র একটি লক্ষ্যকে উপস্থাপন করে।
ডিজেবিপি

@ ডিজেবিপি এবং "কেন নয়?" আমি জানতে চাই. আমি নেমস্পেসিংয়ের ধারণাটি পছন্দ করি তবে এটি আমার ম্যাকবুকটি উইন্ডোটি ফেলে দিতে চায় (আমার কাছে একটি এক্সটেনশন সহ একটি অ্যাপ্লিকেশন রয়েছে এবং এক্সটেনশনটি চালানোর সময় এই সমস্যাটিতে এসে পড়ুন)। নেমস্পেসগুলির সাথে এটি করার একটি "সঠিক" উপায় থাকতে হবে, আমি কেবল এটি বুঝতে পারি না।
S'pht'Kr

হ্যাঁ এই কাজটি আমার জন্য কাজ করেছিল যখন কোনও ওয়ার্কস্পেসে ভাগ করা ডেটা মডেলগুলির সাথে কাজ করতে
নাজ

31

এই প্রশ্নের স্বীকৃত উত্তর আমাকে একই সমস্যা সমাধানে সহায়তা করেছে তবে আমার একটি সতর্কতা ছিল যা আমি ভেবেছিলাম যে অন্যদের পক্ষে সহায়ক হবে। যদি আপনার প্রকল্পের (মডিউল) নামের মধ্যে একটি জায়গা থাকে তবে আপনাকে অবশ্যই স্থানটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন করতে হবে। উদাহরণ স্বরূপ:

সত্তা: MyEntity শ্রেণি: My_app_Name.MyClass


ঠিক যে আমি খুঁজছিলাম! চিয়ার্স!
manosim

আমরা যখন AppName.ClassName দিয়ে ক্লাসের নামটি সেট করি, এক্সকোড 9 এটি বিন্দুটি সরান এবং বিন্দু ছাড়াই একটি ক্লাস তৈরি করে। সুতরাং এটি আর এক্সকোড 9.। এ নেই।
yo2bh


9

আপনি অ্যাপ্লিকেশন বনাম পরীক্ষাগুলি হিসাবে চালাচ্ছেন কিনা তা নির্ভর করে সমস্যাটি হ'ল অ্যাপটি সন্ধান করছে <appName>.<entityName>এবং কখন এটি পরীক্ষার মতো চলছে বলে মনে হচ্ছে <appName>Tests.<entityName>। আমি এই মুহুর্তে যে সমাধানটি ব্যবহার করি (Xcode 6.1) হ'ল Classকোরডেটা ইউআইতে ক্ষেত্রটি পূরণ না করা এবং পরিবর্তে কোডে করা।

আপনি কোড বনাম টেস্ট হিসাবে চালিয়ে যাচ্ছেন এবং সঠিক মডিউলটির নাম ব্যবহার করে আপডেট করুন কিনা এই কোডটি সনাক্ত করবে 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
আমি আপনার সমাধানটি চেষ্টা করেছি তবে আমি "মারাত্মক ত্রুটি: এনএসআরএর উপাদানটি আসল শ্রেণিতে NSManagedObject কাস্ট করার সময় সুইফট অ্যারে এলিমেন্ট টাইপের সাথে মেলে না"। আসলে নিজেকে ingালাইয়ের সময় নয়, লুপের জন্য যাওয়ার চেষ্টা করার সময়।
রডরিগো রুইজ

1
আপনার মডেলটিতে কোনও ধরণের উত্তরাধিকার থাকলে সেই উদাহরণটি কার্যকর হয় না। প্রতিটি নতুন সত্তার জন্য আপনাকে সাবেন্টাইটগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে এবং আপনার তৈরি নতুন সত্তাগুলির সাথে সেগুলি আপডেট করতে হবে।
আন্তন

8

আপনি যদি "মাই-অ্যাপ" এর মতো আপনার প্রকল্পের নামে হাইফেন ব্যবহার করছেন তবে হাইফেনের পরিবর্তে "মাই_এপ.মাইম্যানেজডঅবজেক্ট" এর মতো একটি আন্ডারস্কোর ব্যবহার করুন। সাধারণভাবে, xcdatamodeld ফাইলটির নামটি দেখুন এবং সেই নামের মতো একই উপসর্গটি ব্যবহার করুন। অর্থাত "" My_app_1.xcdatamodeld "" উপসর্গ "My_app_1 প্রয়োজন


1
কি দারুন. আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ. অ্যাপল
ডক্সে

5

এটি তাদের একই সমস্যা ভোগ করতে সহায়তা করতে পারে। আমি ছিলাম সুইফট 2 এবং এক্সকোড 7 বিটা 2 সহ।

সমাধান আমার ক্ষেত্রে মন্তব্য ছিল @objc(EntityName)EntityName.swift


3

আমার অ্যাপটি ঠিক একইভাবে চালিত হয়েছিল, যদিও আমার অ্যাপটি ঠিকঠাক চলছিল। সমস্যাটি হ'ল সম্পাদক> শেষ স্ক্রিনে এনএসম্যানেজডঅবজেক্ট সাবক্লাস তৈরি করার সময় আমি ডিফল্ট গ্রুপের অবস্থানটি ব্যবহার করেছি, লক্ষ্যমাত্রা প্রদর্শিত বা চেক করা হয়নি, যা মাইএপ.এক্সকোডেপ্রোজ অবস্থিত শীর্ষ মাই অ্যাপ ডিরেক্টরিতে সাবক্লাসটি সংরক্ষণ করেছিল।
সতর্কবার্তাটি চলে গেল যখন আমি পরিবর্তে গ্রুপটি মাইএপি সাবফোল্ডারে থাকি এবং মাই অ্যাপের লক্ষ্য পরীক্ষা করেছিলাম।


2

উপরের উত্তরগুলি সহায়ক ছিল। এই দ্রুত বিচক্ষণতা পরীক্ষা আপনাকে কিছুটা সময় সাশ্রয় করতে পারে। প্রকল্পে যান> পর্যায়গুলি তৈরি করুন> উত্সগুলি সংকলন করুন এবং আপনার xcdatamodeld এবং আপনার মডেল ফাইলগুলিকে "-" বোতামটি দিয়ে সরান এবং তারপরে "+" বোতামের সাহায্যে এগুলি যুক্ত করুন। পুনর্নির্মাণ - এটি এটি যত্ন নিতে পারে।


2

যাইহোক আপনি উপসর্গ হিসাবে যা যুক্ত করেন তা যত্নশীল হন: আমার অ্যাপটিকে "এবিসি-ডিফ" বলা হয় এবং এক্সকোড "-" কে "_" রূপান্তর করেছে।

অনুসন্ধানকারীর সুরক্ষিত থাকতে, আপনার প্রকল্পের ফাইলগুলি সন্ধান করুন এবং এটি আপনার ডেটা মডেলের জন্য কী বলেছে তা দেখুন (উদাহরণস্বরূপ "ABC_def.xcdatamodeld") এবং সেখানে যা লেখা আছে তা ব্যবহার করুন !!!


1

উপরের উত্তরগুলি আমাকে উদ্দেশ্য-সি এর সাথে সংযুক্ত বিভিন্ন সমস্যা সমাধান করতে সহায়তা করেছে (সম্ভবত এটি কাউকে সহায়তা করবে):

আপনি যদি সত্তার নামগুলি রিফ্যাক্টর করেন তবে "ইউটিলিটিস প্যানেল" তে "ক্লাস" পরিবর্তন করতে ভুলবেন না।


0

উপরের উত্তরগুলি আমাকে সহায়তা করেছে তবে এটি কারওর পক্ষে সহায়তা করতে পারে। আমার মতো যদি আপনি সেগুলি করেন এবং এখনও সমস্যা হয়ে থাকে তবে কেবল 'আপনার প্রকল্পটি পরিষ্কার করুন' মনে রাখবেন। এক্সকোড 8 এর জন্য, পণ্য> পরিষ্কার করুন। তারপরে আবার দৌড়াও।


0

এক্সকোডে 7 সত্ত্বা এবং শ্রেণীর নাম একই হতে পারে তবে কোডজেনের শ্রেণি সংজ্ঞা হওয়া উচিত। সেক্ষেত্রে কোনও সতর্কতা ইত্যাদি থাকবে না ইত্যাদি চিত্রের বিবরণ এখানে লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.