অ্যাপল তাদের ডকুমেন্টেশনে কী ইঙ্গিত দেয় তা আমি খুঁজে বের করেছি । এটি প্রকৃতপক্ষে খুব সহজ তবে সুস্পষ্ট হওয়ার আগে অনেক দীর্ঘ পথ যেতে হবে। আমি একটি উদাহরণ দিয়ে ব্যাখ্যাটি বর্ণনা করব। প্রাথমিক পরিস্থিতি হ'ল:
ডেটা মডেল সংস্করণ 1
আপনি "মূল ডেটা স্টোরেজ সহ নেভিগেশন ভিত্তিক অ্যাপ্লিকেশন" টেম্পলেট দিয়ে একটি প্রকল্প তৈরি করার সময় এটি আপনার পাওয়া মডেল। আমি এটি সংকলন করেছি এবং কিছু ভিন্ন মান সহ সমস্ত 2k এন্ট্রি তৈরি করতে লুপের জন্য কিছু সহায়তায় কঠোর হিট করেছি। সেখানে আমরা এনএসডিট মান সহ 2.000 ইভেন্টে যাই।
এখন আমরা ডেটা মডেলের একটি দ্বিতীয় সংস্করণ যুক্ত করব, যা দেখতে এটির মতো দেখাচ্ছে:
ডেটা মডেল সংস্করণ 2
পার্থক্যটি হ'ল: ইভেন্ট সত্তা চলে গেছে, এবং আমরা দুটি নতুন পেয়েছি। একটি যা টাইমস্ট্যাম্প হিসাবে সংরক্ষণ করে double
এবং দ্বিতীয়টি যা একটি তারিখ হিসাবে সংরক্ষণ করে NSString
।
লক্ষ্যটি হ'ল সমস্ত সংস্করণ 1 ইভেন্ট দুটি নতুন সত্তায় স্থানান্তর করা এবং মাইগ্রেশনের সাথে মানগুলি রূপান্তর করা। এটি পৃথক সত্তায় পৃথক ধরণের হিসাবে প্রতিটি মানের দ্বিগুণ হয়।
স্থানান্তর করতে, আমরা হাতে মাইগ্রেশন চয়ন করি এবং আমরা ম্যাপিং মডেলগুলি দিয়ে এটি করি। এটিও আপনার প্রশ্নের উত্তরের প্রথম অংশ। আমরা মাইগ্রেশনটি দুটি পদক্ষেপে করব, কারণ 2 কে এন্ট্রি স্থানান্তর করতে দীর্ঘ সময় নিচ্ছে এবং আমরা মেমরির পদক্ষেপ কম রাখতে চাই।
আপনি এমনকি সত্তা সীমা মাত্রার পরিসীমা স্থানান্তর করতে এই ম্যাপিং মডেলগুলি আরও বিভক্ত করতে পারেন। বলুন আমরা এক মিলিয়ন রেকর্ড পেয়েছি, এটি পুরো প্রক্রিয়াটি ক্র্যাশ করতে পারে। ফিল্টার প্রিকিকেট দিয়ে আনীত সংস্থাগুলি সংক্ষিপ্ত করা সম্ভব ।
আমাদের দুটি ম্যাপিং মডেল ফিরে।
আমরা এটির মতো প্রথম ম্যাপিং মডেল তৈরি করি:
1. নতুন ফাইল -> রিসোর্স -> ম্যাপিং মডেল
২. একটি নাম চয়ন করুন, আমি স্টিপওনকে বেছে নিয়েছি
৩. উত্স এবং গন্তব্য ডেটা মডেল সেট করুন
ম্যাপিং মডেল পদক্ষেপ এক
মাল্টি পাস মাইগ্রেশনের জন্য কাস্টম সত্তা মাইগ্রেশন নীতিগুলির প্রয়োজন নেই, তবে আমরা উদাহরণের জন্য আরও কিছু বিশদ পেতে এটি করব। সুতরাং আমরা সত্তায় একটি কাস্টম নীতি যুক্ত করি। এটি সর্বদা একটি সাবক্লাস হয়NSEntityMigrationPolicy
।
এই নীতি শ্রেণিটি আমাদের মাইগ্রেশনটি ঘটানোর জন্য কিছু পদ্ধতি প্রয়োগ করে। তবে এটি এক্ষেত্রে সহজ তাই আমাদের কেবল একটি পদ্ধতি প্রয়োগ করতে হবে:createDestinationInstancesForSourceInstance:entityMapping:manager:error:
।
বাস্তবায়নটি দেখতে এইরকম হবে:
স্টেপঅনেইটিটিমিগ্রেশনপলিসি.এম
#import "StepOneEntityMigrationPolicy.h"
@implementation StepOneEntityMigrationPolicy
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance
entityMapping:(NSEntityMapping *)mapping
manager:(NSMigrationManager *)manager
error:(NSError **)error
{
NSManagedObject *newObject =
[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName]
inManagedObjectContext:[manager destinationContext]];
NSDate *date = [sInstance valueForKey:@"timeStamp"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[newObject setValue:[dateFormatter stringFromDate:date] forKey:@"printedDate"];
[dateFormatter release];
[manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
return YES;
}
চূড়ান্ত পদক্ষেপ: মাইগ্রেশন নিজেই
আমি দ্বিতীয় ম্যাপিংয়ের মডেল স্থাপনের জন্য অংশটি এড়িয়ে যাব যা প্রায় অভিন্ন, NSDate কে ডাবল রূপান্তর করতে ব্যবহৃত একটি সময়IntervalSince1970 ব্যবহৃত হয়েছিল।
অবশেষে আমাদের মাইগ্রেশন ট্রিগার করতে হবে। আমি আপাতত বয়লারপ্লেট কোডটি এড়িয়ে যাব। আপনার যদি এটির প্রয়োজন হয় তবে আমি এখানে পোস্ট করব। এটি মাইগ্রেশন প্রক্রিয়াটি অনুকূলিতকরণে পাওয়া যাবে এটি প্রথম দুটি কোড উদাহরণগুলির একমাত্র মার্জ। তৃতীয় ও শেষ অংশ নিম্নরূপ সংশোধন করা হবে: বর্গ পদ্ধতি ব্যবহার করে পরিবর্তে NSMappingModel
বর্গ mappingModelFromBundles:forSourceModel:destinationModel:
আমরা ব্যবহার করবেinitWithContentsOfURL:
কারণ বর্গ পদ্ধতি শুধুমাত্র এক, হয়তো প্রথম পাওয়া ম্যাপিং বান্ডিল মডেল ফিরে আসবে।
এখন আমরা দুটি ম্যাপিং মডেল পেয়েছি যা লুপের প্রতিটি পাসে ব্যবহৃত হতে পারে এবং মাইগ্রেশন পদ্ধতিটি মাইগ্রেশন ম্যানেজারকে প্রেরণ করতে পারে। এটাই.
NSArray *mappingModelNames = [NSArray arrayWithObjects:@"StepOne", @"StepTwo", nil];
NSDictionary *sourceStoreOptions = nil;
NSURL *destinationStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataMigrationNew.sqlite"];
NSString *destinationStoreType = NSSQLiteStoreType;
NSDictionary *destinationStoreOptions = nil;
for (NSString *mappingModelName in mappingModelNames) {
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:mappingModelName withExtension:@"cdm"];
NSMappingModel *mappingModel = [[NSMappingModel alloc] initWithContentsOfURL:fileURL];
BOOL ok = [migrationManager migrateStoreFromURL:sourceStoreURL
type:sourceStoreType
options:sourceStoreOptions
withMappingModel:mappingModel
toDestinationURL:destinationStoreURL
destinationType:destinationStoreType
destinationOptions:destinationStoreOptions
error:&error2];
[mappingModel release];
}
মন্তব্য
একটি মানচিত্রের মডেলটি cdm
বান্ডলে শেষ হয় ।
গন্তব্য স্টোর সরবরাহ করতে হবে এবং উত্স স্টোর হওয়া উচিত নয়। আপনি সফল স্থানান্তরিত হওয়ার পরে পুরানোটিকে মুছুন এবং নতুনটির নাম পরিবর্তন করতে পারবেন।
আমি ম্যাপিং মডেলগুলি তৈরির পরে ডেটা মডেলটিতে কিছু পরিবর্তন করেছি, এর ফলে কিছু সামঞ্জস্যতা ত্রুটি হয়েছে, যা আমি কেবল ম্যাপিং মডেলগুলি পুনরায় তৈরি করার মাধ্যমে সমাধান করতে পারি।