মডেলগুলি স্বয়ংক্রিয়ভাবে স্থানান্তরিত করতে কোর ডেটা পেতে আমার কী করতে হবে?


96

আমি কোর ডেটা মডেলগুলির জন্য স্বয়ংক্রিয় / হালকা ওজনের মাইগ্রেশন সম্পর্কিত ডকুমেন্টেশন পড়েছি - তবে এটি বাস্তবায়নে আমার সমস্যা হচ্ছে।

আমি এটি বুঝতে পেরে অ্যাপ্লিকেশনটির লক্ষ্য করা উচিত যে এটির যে মডেল রয়েছে এবং ডিভাইসে ইতিমধ্যে বিদ্যমান মডেলটি এক নয়। যদি আপনি কেবল বৈশিষ্ট্য বা সম্পর্ক এবং অনুরূপ সাধারণ পরিবর্তন যুক্ত করেন তবে মডেলটি স্বয়ংক্রিয়ভাবে আপগ্রেড করা উচিত।

কোনও পয়েন্টার - আমার কি এক্সকোডে কিছু সেট করা দরকার?

উত্তর:


138

আমি এখন খুঁজে পেয়েছি যে এটি বেশ সহজ - একবার আপনি কোথায় দেখতে হবে তা জানার পরে।

আমার অ্যাপলিজেটে আমি এনএসপিএসসিস্টেনস্টোরকর্ডিনেটর সেট আপ করেছি - এবং অটো-মাইগ্রেট পরিচালনা করার জন্য আপনাকে এটিতে কিছু বিকল্প যুক্ত করতে হবে:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

তারপরে আপনাকে এক্সকোডে কিছু কৌশল করতে হবে:

  1. আপনার এক্সসিডিটামোডেল ফাইলটি নির্বাচন করুন
  2. শীর্ষে ডিজাইন মেনু নির্বাচন করুন - তারপরে ডেটা মডেল - তারপরে মডেল সংস্করণ যুক্ত করুন
  3. আপনার এক্সসিডিটামোডেল ফাইলটি আপনার এক্সসিডিটামোডেল ফাইলের মতো একই নামের সাথে একটি নতুন ডিরেক্টরিতে স্থানান্তরিত হবে তবে এক্সটেনশন xcdatamodeld সহ - এই ডিরেক্টরিতে নামের সাথে একটি দ্বিতীয় ফাইল থাকবে। নতুন ফাইলটি নির্বাচন করুন এবং তারপরে ডিজাইন-> ডেটা মডেল-> বর্তমান সংস্করণ সেট করুন (এক্সকোড 4 এ আপনি এটি করেন )
  4. আপনি যদি ইতিমধ্যে এমন পরিবর্তনগুলি করে থাকেন যা আপনার প্রকল্পটিকে বেমানান করেছে - তবে এই পরিবর্তনগুলি মূল xcdatamodel ফাইলের বাইরে নিয়ে যান। যদি আপনার এখনও পরিবর্তনগুলি করা না হয় - তবে কেবল 2.xcdatamodel ফাইলটি সম্পাদনা করুন (আপনি কেবলমাত্র বর্তমান সংস্করণটি তৈরি করেছেন)।
  5. এখন যখন আপনি এই সংস্করণটি কোনও পুরানো মডেলযুক্ত কোনও ডিভাইসে ইনস্টল করেন - এটি স্বয়ংক্রিয়ভাবে সেই মডেলটিকে নতুন মডেলে আপগ্রেড করবে।

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

আমি মনে করি আমি যা করব তা হ'ল আমি সমস্ত পরিবর্তিত ফাইল রাখব এবং তারপরে আমার আপডেট স্থাপনের জন্য প্রস্তুত হয়ে গেলে আমি সমস্ত মধ্যবর্তী ফাইলগুলি মুছব এবং কেবলমাত্র প্রাচীনতম এবং সর্বশেষতম মডেলগুলির সাথে স্থাপন করব।


আপডেট (15/07/2011):

আপেল-তে আপডেট ডকুমেন্টেশন রয়েছে উল্লেখ করার জন্য @ রকস্টারবার্লিনকে ধন্যবাদ :

এক্সকোড 4: একটি পরিচালিত অবজেক্ট মডেলের বর্তমান সংস্করণ সেট করা

আপডেট: 8/19/2013 আরও ভাল লিঙ্ক:

https://developer.apple.com/library/content/docamentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModel Format.html


আমি কোড ডেটা মাইগ্রেশন এবং ভার্সন গাইড পড়ার পরামর্শ দিচ্ছি, এক্সকোড ডক দর্শনে এবং বিকাশকারী.এপল.কম এ উপলব্ধ।
হান্টার

4
আমি উত্তরটি কেবল সেখানেই খুঁজে পাইনি - এটি কীভাবে করা যায় তা খুঁজে পেতে কিছুটা সময় নিয়েছিল।
গ্রুপাল

এনএসআইনফারম্যাপিংমডেল স্বয়ংক্রিয়ভাবে অপশনটি ভালভাবে কাজ করে তবে কেবল কোনও অ্যাট্রিবিউটর নাম পরিবর্তন করার মতো সাধারণ ম্যাপিংয়ের জন্য। আরও জটিল কোনও কিছুর জন্য (সম্পর্কগুলি সরিয়ে দেওয়া বা সত্তা যুক্ত করা) আপনার ম্যাপিং মডেল যুক্ত করতে হবে। যদি এক্সকোড অভিযোগ করে যে এনএসআইএনফারম্যাপিংমডেল অটোমেটিকঅપ્শন অঘোষিত, আপনার অ্যাপের প্রতিনিধি শিরোনাম ফাইলে # ইমপোর্ট <কোরেডাটা / কোরডেটা। H> যুক্ত করুন।
এলিস ভ্যান লুইজ

আমি আমার মডেলটিতে কিছু সত্তা যুক্ত করেছি এবং কুখ্যাত পেয়েছি "স্টোর খোলার জন্য ব্যবহৃত মডেলটি দোকান তৈরিতে ব্যবহৃত ত্রুটির সাথে বেমানান"। আপনার সমাধান এটি স্থির! আপনাকে অনেক ধন্যবাদ!
কার্স্টেন সিলজ

4
এই নির্দেশাবলী অনুসরণ করার পরে আপনি যদি "দুটি পৃথক পৃথক সত্তার সাথে মডেলগুলিকে একীভূত করতে পারবেন না" পান তবে নীচে সন্তথোষের উত্তর দেখুন।
benvolioT

14

এটি অবিশ্বাস্যভাবে সহায়ক ছিল। অ্যাপল ডকুমেন্টেশন ছিল - যথারীতি - দু: খজনকভাবে অসম্পূর্ণ। আমি পরিষ্কার-পরিচ্ছন্ন বিল্ড করার পরামর্শ দিই, কারণ আমি যখন এই পরিবর্তনগুলি করার পরে প্রথম দৌড়েছিলাম তখন "দুটি ভিন্ন সত্তা xxx এর সাথে মডেলগুলি মার্জ করতে পারি না" an পরিষ্কার বিল্ড এটি স্থির করে দিয়েছে।


একটি পরিষ্কার বিল্ড আমার সমস্যাগুলিও ঠিক করে দিয়েছে।
জার্নবো

6

গ্রুপাল এর উত্তরটি নিখুঁত ... তবে আপনি যদি এখনও বিল্ডটি বেশ কয়েকবার পরিষ্কার করার পরেও "দুটি আলাদা আলাদা প্রতিষ্ঠান xxx এর সাথে মডেলগুলিকে একীভূত করতে পারবেন না" ... আপনার পরিচালিত অবজেক্টমোডেল কীভাবে লোড হচ্ছে তাতে আপনার সমস্যা থাকতে পারে .. .এটি দেখুন ... যা আমাকে এটি ঠিক করতে সহায়তা করেছিল ..

মূল ডেটা মাইগ্রেশন সমস্যা


3

এছাড়াও, যদি আপনি এই পোস্টে হোঁচট খেয়ে থাকেন, যেমন আমিও করেছি, "স্টোর খোলার জন্য ব্যবহৃত মডেলটি দোকানটি তৈরি করতে ব্যবহৃত একটির সাথে সঙ্গতিপূর্ণ নয়" ত্রুটি এবং আপনি কেবল সিমুলেটরটি ব্যবহার করে ডিবাগ করছেন এবং সম্পূর্ণরূপে প্রতিস্থাপন করতে চান পুরানো মডেল ইনস্টল করা হয়েছে, আপনি কেবল সিমুলেটর অ্যাপ্লিকেশনটি রিসেট করতে পারেন বা সিমুলেটর থেকে আপনার অ্যাপ্লিকেশন মোছা সম্ভবত এটির জন্যও কার্যকর হবে।

এখানে পোস্টগুলি পড়া না হওয়া পর্যন্ত এটি চেষ্টা করা আমার কাছে ঘটেনি, যার পরে আমি বুঝতে পেরেছিলাম যে আমি অ্যাপটি সিমুলেটরে ইনস্টল করেছি এবং পরে মডেলটি পরিবর্তন করেছি, যার ফলে পূর্বোক্ত রান-টাইমের ত্রুটি হয়েছিল।


1

সন্তোষের জবাব অনুসরণ করতে অনুগ্রহ করে আমি তার পরিবর্তে কোড স্নিপেটটি এখানে পোস্ট করব। আপনার initWithContentsOfURL:পরিবর্তে আপনার পরিচালিত অবজেক্টমডেল তৈরি mergedModelFromBundles:করতে হবে অন্যথায় আপনি ত্রুটি পাবেন:

XXX এবং XXX দুটি পৃথক সত্তার সাথে মডেলগুলিকে মার্জ করতে পারবেন না

যদি আপনার মডেল ফাইলটির নাম "মডেল" রাখা হয় তবে আপনি কীভাবে পরিচালিতঅবজেক্টমোডেলটি তৈরি করবেন তা এখানে:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

এই ব্লগ পোস্টে ক্রেডিট ।


1

এক্সকোড 4-এ মেনুটি কিছুটা পরিবর্তন হয়েছিল। এক্সকোড 4 এ এটি কীভাবে করা যায় তার বিবরণ এখানে:

এক্সকোড 4: একটি পরিচালিত অবজেক্ট মডেলের বর্তমান সংস্করণ সেট করা


লিঙ্কটি ইতিমধ্যে ভাঙা। অ্যাপল ডকুমেন্টেশনের লিঙ্কগুলি প্রায় দুই মাস শেষ :(
এমএক্সসিএল

1

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

আমার নতুন কলামগুলিতে "alচ্ছিক" পরীক্ষা করা আছে তা নিশ্চিত হওয়ার সাথে সাথেই আমি আবার মাইগ্রেশন চেষ্টা করেছি এবং এটি কার্যকর হয়েছে।


1

আমি একটি ভিন্ন সমস্যার কারণে এই পোস্টে হোঁচট খেয়েছি, তবে ত্রুটিটি ছিল " দোকানটি খোলার জন্য ব্যবহৃত মডেল কনফিগারেশনটি স্টোর তৈরির জন্য ব্যবহৃত একটির সাথে বেমানান। "

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

আমার কনফিগারেশনগুলি দেখার জন্য সমাধানটি ছিল, বুঝতে হবে যে আমার একটি সত্ত্বা ছিল যা বর্তমানে কোনও কনফিগারেশনে নেই এবং এটিতে যুক্ত করে। স্বপ্নের মতো দৌড়ায়।

এটি ওপির সমস্যা সমাধান করবে না। তবে হয়ত কিছু হতাশ ব্যক্তি যিনি এখানে গুগলের মাধ্যমে অবতরণ করছেন তিনি যে নৌকোটিতে ছিলেন সেখানে থাকবেন :)



0

এক্সকোড সংস্করণ 5 এর জন্য উপরের উপরে @ গ্রুপাল এর দুর্দান্ত নির্দেশগুলিতে গৌণ সম্পাদনা করুন:

পুরানো: ২. শীর্ষে ডিজাইন মেনু নির্বাচন করুন - তারপরে ডেটা মডেল - তারপরে মডেল সংস্করণ যুক্ত করুন

সংস্করণ 5+: 2. সম্পাদক মেনু নির্বাচন করুন, তারপরে মডেল সংস্করণ যুক্ত করুন ..., আপনার সংস্করণ নামটি টাইপ করুন এবং মডেলের উপর ভিত্তি করে (তালিকা থেকে আপনার মূল মডেলটি নির্বাচন করুন)

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