কোরডেটা: সতর্কতা: নামযুক্ত শ্রেণি লোড করতে অক্ষম


95

আমি এক্সকোড .1.১ ব্যবহার করে একটি নতুন সোফ্ট সংস্করণে একটি বিদ্যমান অবজেক্টিভ-সি টিভি শো অ্যাপ্লিকেশনটি নকল করছি এবং কোরডেটা নিয়ে কিছু সমস্যা রয়েছে।

আমি 4 টি সত্তার একটি মডেল তৈরি করেছি, তাদের এনএস-ম্যানেজডঅবজেক্ট সাবক্লাস তৈরি করেছি (সুইফটে) এবং সমস্ত ফাইলের উপযুক্ত অ্যাপ্লিকেশন লক্ষ্যমাত্রা সেট করা আছে ('সংকলন উত্সগুলির জন্য')।

আমি যখনই কোনও নতুন সত্ত্বা sertোকানোর চেষ্টা করি তখনও আমি এই ত্রুটিটি পাচ্ছি:

কোরডেটা: সতর্কতা: সত্তা 'শো' এর জন্য 'শো' নামে শ্রেণি লোড করতে অক্ষম। পরিবর্তে ডিফল্ট NSManagedObject ব্যবহার করে ক্লাস পাওয়া যায় নি।

কয়েকটি মন্তব্য:

কোর ডেটাতে সংরক্ষণ করার সময়, পটভূমি থ্রেডিংয়ের অনুমতি দেওয়ার জন্য আমি পিতা-সন্তানের প্রসঙ্গের উপায়টি ব্যবহার করি। আমি এটি ব্যবহার করে ম্যানেজডঅবজেক্ট কনটেক্সট সেট করে এটি করি:

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

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

মডেল সম্পাদকটিতে ক্লাসটি সঠিকভাবে সেট করা আছে কিনা তা নিশ্চিত করে আমি বেশিরভাগ ক্ষেত্রে এ থেকে মুক্তি পেতে সক্ষম হয়েছি । অন্যান্য অনেক SOF পোস্ট (এই প্রশ্নের উত্তর সহ) মতো পরামর্শ মডিউল নাম (মত অন্তর্ভুক্ত করা MyApp.Shows) আছে না আমাকে সাহায্য করেছে।

নিশ্চিত হয়ে নিন যে আপনি এই তিনটি আইটেম পরীক্ষা করেছেন:

1.
সংস্করণ যা এক্সকোড 7 বিটা 3 পর্যন্ত কাজ করে

এক্সকোড 7 বি 3 পর্যন্ত

লক্ষ্য করুন যে আমি আপনার সত্তার নামটি আরও উপযুক্ত একাঙ্কারে সংশোধন করেছি।

এক্সকোড .1.১-এ সুইফট ২.০-এর জন্য কাজ করে এমন সংস্করণ
(এক্সকোড 7 বিটা 4 এবং ততোধিকের জন্য কাজ করা উচিত)

আপনাকে মডিউলটিতে "বর্তমান পণ্য মডিউল" লেখাটি মুছতে হবে!

এক্সকোড 7 বিটা 3 থেকে

২.
অন্তর্ভুক্ত করার জন্য আপনার ঘন ঘন পরামর্শও অনুসরণ করা উচিত

@objc(Show)

আপনার ক্লাসের ঠিক উপরে।

দ্রষ্টব্য : আপনি যদি Xcode 7 বিটা 4 বা তার বেশি ব্যবহার করেন তবে এই পদক্ষেপটি alচ্ছিক।

৩. তৈরি হওয়া ব্যবস্থাপনিত অবজেক্টটিকে যথাযথ শ্রেণিতে কাস্ট
করার বিষয়টি নিশ্চিত করুন , ডিফল্টটি ঠিক হবে ।NSManagedObject

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

4
ধন্যবাদ! আমি প্রস্তাবিত নামকরণের কনভেনশন আপডেট করেছি এবং এটি '@objc (শো)' বলে মনে হচ্ছে যে 'শ্রেণি লোড করতে অক্ষম ...' ত্রুটি ঠিক করার কৌশলটি করা হয়েছে। অনেক প্রশংসিত!
জিমি জামেমেড

হাই @ মুন্ডি তোমাকে অনেক ধন্যবাদ! আপনি কি এখনও মনে করতে হবে উত্স কোথায় ছিল?
iamdavidlam

4
উদাহরণস্বরূপ দেখুন এই প্রশ্ন । কী চলছে তা বুঝতে এখানে যথেষ্ট তথ্য রয়েছে।
মুন্ডি

4

4
@ মুন্ডি, আপনি নিজের উত্তরটি আবার আপডেট করতে চাইতে পারেন। খুনশানের উত্তর আপডেট দেখুন।
সুরগাচ

76

সুইফট 2 / এক্সকোডি 7 আপডেট:

অ্যাপল দ্বারা সুইফট 2 এবং এক্সকোড 7 বিটা প্রকাশে এই ইস্যুটি (এই উত্তরটিতে আমার 3 এপ্রিলের মন্তব্যটিও দেখুন) সমাধান করা হয়েছে । সুতরাং আপনার এখন সুইডে মুন্ডির উত্তর অনুসারে বা আপনার শ্রেণীর নামের আগে " " ব্যবহারের দরকার নেই । এটি কাজ করা বন্ধ করবে। সুতরাং এগুলি সরান, কেবল ফাইলের নাম দিন এবং মডিউল এবং চিয়ার হিসাবে নির্বাচন করুন !@objc(myEntity)MyAppName.ClassCurrent Working Module

বর্তমান ওয়ার্কিং মডিউল নির্বাচন করা হচ্ছে

তবে যারা @objc(myEntity)সুইফ্টে (আমার মত) ব্যবহার করছেন তাদের জন্য আপনি এই অন্যান্য সমাধানটি ব্যবহার করতে পারেন যা সহজেই কাজ করে ly

Xcdatamodel সঠিক শ্রেণিতে in এটির মতো দেখতে হবে:

ক্লাস নির্ধারণ

আপনি এখানে যান। Module.Classসুইফট এবং উপর XCode 6. মধ্যে CoreData জন্য প্যাটার্ন ব্যবহার করে যখন আপনি একই পদ্ধতি প্রয়োজন হবে কাস্টম নীতি মডেল নীতি বা অন্যান্য CoreData কাপড় মধ্যে বর্গ। একটি দ্রষ্টব্য: ছবিতে, নাম এবং শ্রেণিটি কার এবং মাই অ্যাপনেম.কার (অথবা আপনার সত্তার নাম যাই হোক না কেন) হওয়া উচিত। এখানে, Userএকটি টাইপো হয়।


এই সমাধানটির সাথে সমস্যাটি হ'ল স্বয়ংক্রিয় উত্পাদনকারী সত্তা শ্রেণিগুলি আর সঠিকভাবে কাজ করবে না (এটি মডিউলের নাম সহ কেবল একটি শ্রেণি উত্পন্ন করবে)। দেখুন: এনএসম্যানেজডঅবজেক্ট সাবক্লাসটি সঠিকভাবে তৈরি হচ্ছে না তা তৈরি করুন
মিলোস

NSManagedObject সত্তা শ্রেণি তৈরি করার পরে আপনার সমাধানটি প্রয়োগ করতে হবে। সম্ভবত একটি xcode 6.xx বাগ মুছে ফেলা হবে।
খুনশান

4
হ্যাঁ, এটি নিঃসন্দেহে সমাধান করা হবে। অটো জেনারেটেড ক্লাসগুলি ইতিমধ্যে @objc (<শ্রেণীর নাম সত্তা পরিদর্শক হিসাবে সন্নিবেশিত>) দিয়ে সজ্জিত করা উচিত বা সম্ভবত, অ্যাপল এটিকে অপ্রয়োজনীয় করে তুলবে।
মিলোস

4
লোকেরা এখনও এটি পড়ছে। ' মাই অ্যাপনেম.কার ' ব্যবহার করা আমার পক্ষে কাজ করে না, যখন আমি ' মাই অ্যাপননেম ' সরিয়েছি তখন তা কার্যকর হয়েছিল। 'অংশ। সুতরাং Carউভয় ক্ষেত্রের জন্য কৌতুকটি করেছেন।
গিদিওন

4
তুমি চ্যাম্প !!!! যাক ব্যক্তি = এনএসইটিডিটিসিলিপশন.সিনেট নিউইউবজেক্ট (forEntityName: "ব্যক্তি", এর মধ্যে: প্রসঙ্গে)! ব্যক্তি
অভিমন্যু রাঠোর

36

এক্সকোড 7 এবং বিশুদ্ধরূপে সুইফ্ট ব্যবহার করার সময়, আমাকে আসলে আমার স্বয়ংক্রিয়ভাবে উত্পন্ন সাবক্লাস থেকে সরানো @objc(MyClass) হয়েছিল NSManagedObject( Editor> থেকে উত্পন্ন Create NSManagedObject Subclass...)।


4
বাহ এই উত্তর পোস্ট করার জন্য ধন্যবাদ। আমি দেওয়ালের বিরুদ্ধে মাথা ঠাপাতে শুরু করছিলাম।
জিয়া

একই সমস্যা এখানে - একটি বাগ জমা দেওয়া।
মিরেকে

আমার জন্যও কাজ করেছেন। এটি অপসারণ করতে হবে। উদ্ভট।
কেন্ট

আমার পরীক্ষাগুলি অনুসারে এটি একটি মিথ্যা ইতিবাচক মতো দেখাচ্ছে looks
মুন্ডি

আমাকে এটিকে সরিয়ে ফেলতে হয়েছিল এবং বর্তমান পণ্য মডিউলটি সেট করতে হয়েছিল, তবেই এটি কাজ করেছিল
ওলেগ শেরম্যান

13

এক্সকোড 7 বিটা 2 (এবং আমি বিশ্বাস করি 1), মডেল কনফিগারেশনে টাইপের একটি নতুন পরিচালিত অবজেক্ট Fileমডিউলটিতে সেট করা হয়েছে Current Product Moduleএবং অবজেক্টের শ্রেণিটি কনফিগারেশনে প্রদর্শিত হবে .File

এক্সকোড 7 এ "বর্তমান পণ্য মডিউল" তে সেট করা পরিচালিত অবজেক্ট টাইপের মডিউল

মডিউল সেটিংস মুছে ফেলা যাতে এটি ফাঁকা হয়, বা সম্পূর্ণ স্টপ সরিয়ে ফেলা হয় তাই কনফিগারেশনে শ্রেণীর নামটি Fileসমান ক্রিয়া হয়, কারণ প্রত্যেকে অন্য পরিবর্তনের কারণ হয়ে থাকে। এই কনফিগারেশনটি সংরক্ষণ করা বর্ণিত ত্রুটিটি সরিয়ে ফেলবে।

এক্সকোড 7 এ ম্যানেজ করা অবজেক্টের মডিউল ফাঁকা থাকবে


9

এক্সকোড .1.১.১ এ আপনাকে @objc অ্যাট্রিবিউটটি যুক্ত করার দরকার নেই যেহেতু বেস সত্তাটি একটি অবজেক্ট শ্রেণির একটি উপসেট (NSManagedObject) ( সুইফট প্রকারের সামঞ্জস্যতা দেখুন C কোরডাটাতে পূর্ণ মডিউল C শ্রেণির নাম আবশ্যক aware মডিউলটি সচেতন থাকুন নাম সেটিংস সেটিংসে -> প্যাকেজিং -> পণ্যের মডিউল নাম সেট করা আছে default ডিফল্টরূপে এটি $ (PRODUCT_NAME: c99extidentifier) ​​এ সেট করা থাকে যা লক্ষ্যমাত্রার নাম হবে


হ্যাঁ! এটি আধুনিক উত্তর (এক্সকোড 6.3.2)। ডান বান্ডিল নাম ব্যবহার করা কী। আমার ক্ষেত্রে এটি রূপান্তরিত my-productহয়েছিল my_productএবং এটি কোর ডেটার সাথে সমস্ত পার্থক্য তৈরি করেছিল।
সিম্পলজি 26'15

5

এক্সকোড and এবং সুইফট ২.০ সংস্করণ সহ, আপনাকে @objc (NameOfClass) যুক্ত করার দরকার নেই, কেবল নীচের মত "ডেটা মডেল ইন্সপেক্টর দেখান" ট্যাবে সত্তা সেটিংস পরিবর্তন করুন -

নাম - "আপনার সত্তার নাম"

শ্রেণি - "আপনার সত্তার নাম"

মডিউল - "বর্তমান পণ্য মডিউল"

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

সত্তা শ্রেণীর ফাইলের জন্য কোডটি হবে (আমার কোডে সত্তাটি পারিবারিক) -

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}

এই উদাহরণটি এক্সকোড 7.0 + সুইফট ২.০ সহ আমার অ্যাপে ভাল কাজ করছে


3

PRODUCT_MODULE_NAMEআপনার পণ্য মডিউল নাম দিয়ে প্রতিস্থাপন করতে ভুলবেন না ।

যখন কোনও নতুন সত্তা তৈরি করা হয়, আপনাকে ডেটা মডেল ইন্সপেক্টর (শেষ ট্যাব) এ গিয়ে PRODUCT_MODULE_NAMEআপনার মডিউলটির নামটি প্রতিস্থাপন করতে হবে, অথবা class not foundঅবিরাম স্টোর সমন্বয়কারী তৈরি করার সময় এটির একটি ত্রুটি ঘটবে ।


2

আপনাকে নিজের ব্যবহার করতে হবে (কমপক্ষে এক্সকোড .3.৩.২ সহ) মডিউল.কাস্ট আপনার কাস্ট সম্পাদন করার সময় ক্লাস উদাহরণস্বরূপ: আপনার মডিউল ধরে নেওয়া (অর্থাত্ পণ্যের নাম) খাদ্য এবং আপনার শ্রেণি ফল

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

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

পুনরুদ্ধার:

  • ডেটা মডেল এডিটরে সত্তা নির্ধারণের সময় মডিউল নাম অন্তর্ভুক্ত করুন (নাম: ফল, শ্রেণি: খাদ্য.ফর্ট)
  • কোডে সত্তা অ্যাক্সেস করার সময় (ieSWIFT), এটি মডিউল.ক্লাসের সাথে কাস্ট করুন (উদাঃ Food.Fruit)

আপনাকে ধন্যবাদ, দ্বিতীয় পয়েন্টটি খুব গুরুত্বপূর্ণ। কাস্ট করার সময় আমাকে "মডিউল.ক্লাস" ব্যবহার করতে হয়েছিল।
জোয়েট

2

আমিও একই ধরণের সমস্যার মুখোমুখি হয়েছি, সমাধানের জন্য এই পদক্ষেপগুলি অনুসরণ করুন :

  1. অভিভাবক হলেন এনএসম্যানেজডঅবজেক্ট, এনএসবজেক্ট নয়
  2. কোনও সত্তার মডিউল ডিফল্ট, "বর্তমান পণ্য মডিউল" নয়

1

প্রশ্নে শ্রেণীর সাথে সম্পর্কিত হয়ে ডেটা মডেল সম্পাদকটিতে সত্তা শ্রেণীর নাম পরিবর্তন করা এবং ক্লাস @objc(NameOfClass)ঘোষণার ঠিক উপরে প্রতিটি এনএস-ম্যানেজডঅবজেক্টের ফাইল যুক্ত করা ইউনিট পরীক্ষার সময় আমার জন্য এই সমস্যাটি সমাধান করেছে।


0

আমার জন্য যা কাজ করেছে (এক্সকোড .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

এক্সকোড ১১.৫ এর জন্য: যদি কোডজেন সম্পত্তি শ্রেণি সংজ্ঞা হয় এবং আপনি যদি এক্সসিডিটামোডেলে তৈরি সত্তার জন্য কোনও পরামর্শ না পান তবে। এক্সকোড ছেড়ে আবার আপনার প্রকল্পটি আবার খোলার চেষ্টা করুন। এটা আমার জন্য কাজ করে. এই উত্তরটি কেবলমাত্র যদি আপনি প্রস্তাবনা না পান তবে যদি আপনার ফাইলটি উত্পন্ন না হয় তবে উপরের কোনও উত্তর চেষ্টা করে দেখুন।

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