স্টোর খোলার জন্য ব্যবহৃত মডেলটি স্টোর তৈরিতে ব্যবহৃত একের সাথে বেমানান


181

আমি এক্সকোড ৩.২ এ একটি কোর ডেটা মডেল তৈরি করেছি এবং এক্সকোড ৪.২-এ আপগ্রেড করার পরে আমি এনএসম্যানেজডঅবজেক্ট সাবক্লাসের একটি নতুন সত্তা যুক্ত করেছি (নতুন সত্তাটি দেখুন)।

প্রথম কথা, এটি অদ্ভুত দেখাচ্ছে কারণ এটি পুরানো দলের মতো একই গ্রুপে নেই। আমার এক্সকোড ৪.২-এর চিত্র এখানেই রয়েছে (অ্যালকিতাবডিবি হ'ল আমি এক্সকোড ৩.২ এ তৈরি করেছি, এন্ডেডিবি বর্তমান এক্সকোড সংস্করণ (৪.২) থেকে নতুন:

নতুন সত্তা xdatamodel এ গোষ্ঠীভুক্ত নয়

দ্বিতীয় জিনিস, আমি এটি যেমনটি রেখেছি, তারপরে আমি দ্বিতীয় সত্তাকে (নতুনটি) প্রথম সত্তার (পুরানোটির) একইভাবে অ্যাক্সেস করেছি এবং শিরোনাম অনুসারে ত্রুটিটি উপস্থিত হয়েছে।

ত্রুটি এখানে:

2012-01-16 21:13:38.496 iHuria[55953:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x8829cd0 {metadata=<CFBasicHash 0x882a370 [0x1839b38]>{type = immutable dict, count = 7,
entries =>
    2 : <CFString 0x8829b90 [0x1839b38]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x8829ff0 [0x1839b38]>{type = immutable, count = 0, values = ()}
    4 : <CFString 0x8829bc0 [0x1839b38]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x8829770 [0x1839b38]>{value = +320, type = kCFNumberSInt64Type}
    6 : <CFString 0x8829bf0 [0x1839b38]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x882a080 [0x1839b38]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x882a010 [0x1839b38]>{contents = "AlkitabDB"} = <CFData 0x882a030 [0x1839b38]>{length = 32, capacity = 32, bytes = 0xd02ac5f8be6ab0b39add450aca202ac0 ... 3d45d462998d2ccd}
}

    7 : <CFString 0x10e3aa8 [0x1839b38]>{contents = "NSStoreUUID"} = <CFString 0x8829e60 [0x1839b38]>{contents = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59"}
    8 : <CFString 0x10e3948 [0x1839b38]>{contents = "NSStoreType"} = <CFString 0x10e3958 [0x1839b38]>{contents = "SQLite"}
    9 : <CFString 0x8829c40 [0x1839b38]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6b1c7c0 [0x1839b38]>{value = +3, type = kCFNumberSInt32Type}
    10 : <CFString 0x8829c70 [0x1839b38]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x882a0c0 [0x1839b38]>{contents = "2"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            AlkitabDB = <d02ac5f8 be6ab0b3 9add450a ca202ac0 ebd1e860 cbb578c2 3d45d462 998d2ccd>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4F2EE7FF-463B-4055-BBED-8E603CDBDF59";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

আমি এর আগে সমাধানটি সন্ধান করেছি এবং আবিষ্কার করেছি যে আমার সিমুলেটর থেকে প্রশংসা সরিয়ে অ্যাপটি পুনরায় চালু করা উচিত, এবং এটি কার্যকর হয়নি। কেউ কি এই সমস্যার সমাধান জানে? সাহায্য করুন.

উত্তর:


294

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

যারা ডকুমেন্টেশন খনন করতে চান না এবং দ্রুত সমাধানের সন্ধান করছেন:

  1. আপনার .xcdatamodeld ফাইলটি খুলুন
  2. সম্পাদক এ ক্লিক করুন
  3. মডেল সংস্করণ যুক্ত করুন নির্বাচন করুন ...
  4. আপনার মডেলের একটি নতুন সংস্করণ যুক্ত করুন (ডেটামোডেলের নতুন গ্রুপ যুক্ত হয়েছে)
  5. প্রধান ফাইলটি নির্বাচন করুন, ফাইল পরিদর্শক খুলুন (ডান হাতের প্যানেল)
  6. এবং এর অধীনে Versioned core data modelআপনার বর্তমান ডেটা মডেলের জন্য ডেটা মডেলের নতুন সংস্করণ নির্বাচন করুন
  7. এটি সমস্ত নয়) আপনার তথাকথিত "হালকা স্থানান্তর" করা উচিত।
  8. আপনার কাছে যান AppDelegateএবং কোথায় persistentStoreCoordinatorতৈরি হচ্ছে তা সন্ধান করুন
  9. এই লাইনটি সন্ধান করুন if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
  10. এর nilসাথে বিকল্পগুলি প্রতিস্থাপন করুন @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES}(সেই পদ্ধতিতে মন্তব্য কোডটিতে প্রকৃতপক্ষে সরবরাহ করা হয়েছে)
  11. এই যে তুমি যাও, মজা কর!

পিএস এটি কেবল হালকা ওজনের স্থানান্তরের জন্য প্রযোজ্য। আপনার মাইগ্রেশনটি হালকা ওজনের স্থানান্তর হিসাবে যোগ্য হওয়ার জন্য, আপনার পরিবর্তনগুলি এই সরু ব্যান্ডের মধ্যে সীমাবদ্ধ থাকতে হবে:

  • কোনও সম্পত্তি যুক্ত করুন বা মুছুন (বৈশিষ্ট্য বা সম্পর্ক)।
  • একটি নিরবচ্ছিন্ন সম্পত্তি Makeচ্ছিক করুন।
  • যতক্ষণ আপনি একটি ডিফল্ট মান সরবরাহ করেন ততক্ষণ পর্যন্ত একটি alচ্ছিক গুণাবলী অবিচ্ছিন্ন করুন।
  • কোনও সত্তা যুক্ত বা সরিয়ে দিন।
  • একটি সম্পত্তি নাম পরিবর্তন করুন।
  • একটি সত্তার নাম পরিবর্তন করুন।

সুইফট 4 এর জন্য

coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

2
প্রধান ফাইলটি আপনার তৈরি করা .xcdatamodel। আপনার ইউটিলিটিস পেনের প্রথম ট্যাবটি খুলতে হবে (ডান দিকে এক দিকের) এবং "মডেল সংস্করণ" (এক্সকোড 5.1) সন্ধান করুন এবং বর্তমান নির্বাচন করুন: "আপনার নতুন নির্মিত .xcdatamodel"
স্টাস

1
@ কম্পিউটার_ভিউজ 123, এক্সকোড 5.1.1 এ একে 'মডেল সংস্করণ' বলা হয়েছে
স্টাস

1
আমি কীভাবে এটি সুইফট করব?
অ্যাডিসন

2
আমি এই ত্রুটিটি পেয়েছি: "কোরডাটা: ত্রুটি: -আড্ডপর্সিস্টেন্টস্টোরের লেখার টাইপ: এসকিউলাইট কনফিগারেশন: (নাল) ইউআরএল: ফাইল: ///...file.sqlite বিকল্প: S NSInferMappingModel স্বতঃআপনি অপশন = 1; NSMigratePersन्टStores স্বয়ংক্রিয়ভাবে অপশন = 1; error ... ত্রুটি ফিরে এসেছে; ডোমেন = এনএসকোকাআরআরডোমাইন কোড = 134130 "ক্রিয়াকলাপটি শেষ করা যায়নি। (কোকো ত্রুটি 134130.) "
কারমেনা

3
সুইফ্ট মাইগ্রেশন বিকল্পগুলি:let options = [ NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption:true ]
হামজা

285

সিমুলেটর থেকে অ্যাপটি সরান এবং আপনার প্রকল্পে একটি পরিষ্কার সঞ্চালন করুন। এই বিষয়গুলি আপ সাফ করা উচিত। আপনি অ্যাপটি মুছলে আপনি ডিবাগারে চলছেন না তা নিশ্চিত করুন বা অন্যথায় এটি সঠিকভাবে মুছবে না।

আপনি যদি নিশ্চিত হয়ে যেতে চান যে এটি চলে গেছে তবে এই ডিরেক্টরিটি পরীক্ষা করে দেখুন Users/INSERT_YOUR_USER_HERE/Library/Application Support/iPhone Simulator/ যে সংস্করণটি চালাচ্ছেন তার অধীনে আপনার অ্যাপ্লিকেশনটির ফোল্ডারের জন্য করুন।

দ্রষ্টব্য: এটি কেবল উন্নয়নের জন্য। উত্পাদনের জন্য, আপনাকে কোনও ধরণের স্থানান্তর বাস্তবায়ন করতে হবে। গুগল "কোর ডেটা মাইগ্রেশন", যার মধ্যে হালকা ওজনের মাইগ্রেশন সবচেয়ে সহজ।


জবাব দিয়েছিলেন ফিলিপ, আমি চেষ্টা করেছিলাম এবং এটি কাজ করে না :(, আপনার কাছে অন্য কোনও পরামর্শ আছে?
উপভোগ করুন

আপনি নিজের অ্যাপের প্রতিনিধিতে মডেল এবং অবিরাম স্টোর তৈরির কোডটি পোস্ট করতে পারেন?
ফিলিপ সবুরিন

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

Xcode 4.6 এ সমস্যার সমাধান করতে আমাকে সহায়তা করেছে, যেখানে আমি ভুল করে আমার সমস্ত প্রকল্পের ফাইল ট্র্যাশে পাঠিয়েছি: /
রামিরোগম

6
এটি কেবল উন্নয়নের জন্য! উত্পাদনের জন্য, আপনি মডেল সংস্করণ এবং মাইগ্রেশন ব্যবহার করেন। বিকাশকারী.অ্যাপল.
com/লিবারি / আইওএস /# ডকুমেন্টেশন / কোকোয়া / কনসেপ্টুয়াল/…

35

নীচের মত মূল ডেটা পদ্ধতির জন্য AppDelegate.m ফাইলে স্থির স্টোরকর্ডিনেটর তৈরি করার সময় কেবলমাত্র বিকল্প বৈশিষ্ট্য যুক্ত করুন

উদ্দেশ্য গ

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
    {
        return _persistentStoreCoordinator;
    }

    NSLog(@"persistentStoreCoordinator___");
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    NSLog(@"persistentStoreCoordinator___2");
    return _persistentStoreCoordinator;
}

স্যুইফ্ট

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."

    // MAIN LINE OF CODE TO ADD
    let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
                    NSInferMappingModelAutomaticallyOption: true]

    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: mOptions)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}

এটি আমার সমস্যার সমাধান করেছিল ..


1
সত্যিই সহায়ক এই পোস্টের জন্য আপনাকে ধন্যবাদ
সুব্রতী

23

উত্তর: সিমুলেটর থেকে অ্যাপটি সরান, একটি পরিচ্ছন্ন সম্পাদন করুন এবং আপনার প্রকল্পটি পুনরায় তৈরি করুন।

দ্রষ্টব্য: আপনি যখনই কোর ডেটা সংজ্ঞায় পরিবর্তনগুলি সম্পাদন করেন, তখন ফিজিক্যাল ডিভাইস বা সিমুলেটরে ইনস্টল থাকা অ্যাপটি মুছুন, প্রজেক্টটি পরিষ্কার করুন এবং পুনরায় বিল্ড করুন।


সিমুলেটরটিতে সামগ্রী এবং সেটিংস পুনরায় সেট করা আমার জন্য সমস্যাটি স্থির করে দিয়েছে! ধন্যবাদ
সেপ্টেম্বর

14

হ্যাঁ. একবার আপনি শারীরিক ডিভাইসে অ্যাপটিকে মুছুন এবং এটি পুনরায় বিল্ড করুন।


এটি প্রকৃতপক্ষে গ্রহণযোগ্য উত্তরের চেয়ে আমার সমস্যার সমাধান করেছে। ধন্যবাদ!
কেন ডাব্লু

উত্পাদনে কী ঘটে তার উত্তরটি নয়
এডুয়ার্ডো অলিভারস

এটি একটি ভয়াবহ উত্তর, আপনাকে আপনার নতুন মডেলে মাইগ্রেশন যুক্ত করতে হবে অন্যথায় অ্যাপটি
ক্রড হয়ে যাবে

14

সুইফ্টের জন্য, অ্যাপডেলিগেট.সুইফ্টে লাইনটি সন্ধান করুন

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration:  nil, URL: url, options: nil )

এবং এটি দিয়ে প্রতিস্থাপন

try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true])

11

আমি এই ত্রুটিটির বিরুদ্ধে লড়াই করার জন্য বেশ কয়েকদিন অতিবাহিত করেছি, পাশাপাশি মার্জড মডেলফ্র্যামব্যান্ডস ক্র্যাশ হয়েছে এবং "*" ত্রুটির নামের দুটি পৃথক সত্তার সাথে মডেলগুলি মার্জ করতে পারি না।

এটির মূল সমস্যাটি দেখা যাচ্ছে যে এক্সকোড ডিভাইসগুলি থেকে পুরানো সংস্থানগুলি সরিয়ে দেয় না এবং আমার কাছে আমার ডেটা মডেল (.mom ফাইল) এর পুরানো সংস্করণ ছিল যা বিরোধ সৃষ্টি করেছিল। এ কারণেই অ্যাপ মুছে ফেলা আমার ডিভাইসের একটিতে সমস্যাটি স্থির করে।

অন্য এসও উত্তরের মাধ্যমে এই ব্লগ পোস্টটি সন্ধান করার পরে আমি সমস্ত অ্যাপ্লিকেশন ফাইলগুলি সন্ধান করে যা এই লাইনটি পরিবর্তন করে আমার অ্যাপ্লিকেশনটিকে পুরানো মডেলগুলিকে আরও সহনশীল করে তুলেছে:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

এটি কেবল ফিল্টার ডিরেক্টরিতে দেখায়:

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

আমি এই প্রশ্নটি থেকে পুনরাবৃত্তপথের জন্য রিসোর্সঅফটাইপ ব্যবহার করেছি: অ্যাপে সমস্ত .mom ফাইল লগ ইন করে এটি নির্ধারণ করতে সহায়তা করতে:

NSArray *momPaths = [self recursivePathsForResourcesOfType:@"mom" inDirectory:[[NSBundle mainBundle] resourcePath]];
NSLog(@"All .mom files:%@",momPaths);

আমি এক্সট্রান্সিয়াস .mom ফাইলগুলি দেখার জন্য আইই এক্সপ্লোরারও ব্যবহার করেছি (আমি এখনও সেগুলি মুছতে চেষ্টা করি নি)।

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

- (BOOL)comparePersistentStore:(NSPersistentStoreCoordinator *)psc withStoreURL: (NSURL *)storeURL {
    NSError *error = nil;

    // Get the entities & keys from the persistent store coordinator
    NSManagedObjectModel *pscModel = [psc managedObjectModel];
    NSDictionary *pscEntities = [pscModel entitiesByName];
    NSSet *pscKeys = [NSSet setWithArray:[pscEntities allKeys]];
    //NSLog(@"psc model:%@", pscModel);
    //NSLog(@"psc keys:%@", pscKeys);
    NSLog(@"psc contains %d entities", [pscModel.entities count]);

    // Get the entity hashes from the storeURL
    NSDictionary *storeMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                                          URL:storeURL
                                                                                        error:&error];
    NSDictionary *storeHashes = [storeMetadata objectForKey:@"NSStoreModelVersionHashes"];
    //NSLog(@"store metadata:%@", sourceMetadata);
    NSLog(@"store URL:%@", storeURL);
    NSLog(@"store NSStoreUUID:%@", [storeMetadata objectForKey:@"NSStoreUUID"]);
    NSLog(@"store NSStoreType:%@", [storeMetadata objectForKey:@"NSStoreType"]);
    NSSet *storeKeys = [NSSet setWithArray:[storeHashes allKeys]];

    // Determine store entities that were added, removed, and in common (to/with psc)
    NSMutableSet *addedEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *removedEntities = [NSMutableSet setWithSet:storeKeys];
    NSMutableSet *commonEntities = [NSMutableSet setWithSet:pscKeys];
    NSMutableSet *changedEntities = [NSMutableSet new];
    [addedEntities minusSet:storeKeys];
    [removedEntities minusSet:pscKeys];
    [commonEntities minusSet:removedEntities];
    [commonEntities minusSet:addedEntities];

    // Determine entities that have changed (with different hashes)
    [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
        NSData *storeHash = [storeHashes objectForKey:key];
        NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
        if ( ! [pscDescrip.versionHash isEqualToData:storeHash]) {
            if (storeHash != nil && pscDescrip.versionHash != nil) {
                [changedEntities addObject:key];
            }
        }
    }];

    // Remove changed entities from common list
    [commonEntities minusSet:changedEntities];

    if ([commonEntities count] > 0) {
        NSLog(@"Common entities:");
        [commonEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([changedEntities count] > 0) {
        NSLog(@"Changed entities:");
        [changedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\tpsc   %@:\t%@", key, pscDescrip.versionHash);
            NSLog(@"\tstore %@:\t%@", key, storeHash);
    }];
    }
    if ([addedEntities count] > 0) {
        NSLog(@"Added entities to psc model (not in store):");
        [addedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSEntityDescription *pscDescrip = [pscEntities objectForKey:key];
            NSLog(@"\t%@:\t%@", key, pscDescrip.versionHash);
        }];
    }
    if ([removedEntities count] > 0) {
        NSLog(@"Removed entities from psc model (exist in store):");
        [removedEntities enumerateObjectsUsingBlock:^(NSString *key, BOOL *stop) {
            NSData *storeHash = [storeHashes objectForKey:key];
            NSLog(@"\t%@:\t%@", key, storeHash);
        }];
    }

    BOOL pscCompatibile = [pscModel isConfiguration:nil     compatibleWithStoreMetadata:storeMetadata];
    NSLog(@"Migration needed? %@", pscCompatibile?@"no":@"yes");

    return pscCompatibile;
}

ব্যবহার: প্রতিটি দোকান এনএসপারসিস্ট্যান্টস্টোরকর্ডিনেটরে যুক্ত করার আগে ডাকা হয়েছিল:

    [self comparePersistentStore:self.psc withStoreURL:self.iCloudStoreURL];
    _iCloudStore = [self.psc addPersistentStoreWithType:NSSQLiteStoreType
                                          configuration:nil
                                                    URL:self.iCloudStoreURL
                                                options:options
                                                  error:&localError];

10

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


20
প্রযোজনা অ্যাপসের কী হবে? আপনি যদি কোর ডেটা পরিবর্তনের মাধ্যমে অ্যাপ স্টোরের কোনও আপডেট ঠেকেন ততক্ষণে তারা কি ক্রাশ হবে? Thx
rwyland


3
হ্যাঁ, সিডি মডেলের পরিবর্তনগুলি পূর্ববর্তী মডেলের সাথে উত্পন্ন ডেটা লোড হতে বাধা দেয়। এটি পরিচালনা করতে, আপনাকে সমস্যাটি সনাক্ত করতে হবে এবং একটি কোর ডেটা মাইগ্রেশন করতে হবে।
জোহান


7

সোফ্ট ২.১, এক্সকোড in এ আমার পক্ষে সবচেয়ে সহজ সমাধানটি হ'ল:

  1. সিমুলেটর থেকে অ্যাপটি মুছুন (হোম স্ক্রিনে যেতে Cmd + Shift + H। অ্যাপটি দীর্ঘক্ষণ টিপুন, ক্রস ক্লিক করুন, আপনি নিজের ফোন থেকে কোনও অ্যাপ মুছে ফেলেন ঠিক সেইভাবেই)

  2. অ্যাপগুলির নাচ বন্ধ করতে আবার সিএমডি + শিফট + এইচ করুন

  3. আপনার প্রকল্পে ফিরে যান এবং পুনরায় চালু করুন

2 টি প্রতিষ্ঠানের সেট আপ সহ কোর ডেটা থেকে লেখার / পড়ার সময় আমার এই সমস্যাটি ছিল। অ্যাপ্লিকেশনটি মোছা হচ্ছে এবং প্রোগ্রামটি পুনরায় চালিত করা সমস্যার সমাধান করেছে


2
উত্পাদনের খারাপ অভ্যাস, অ্যাপটি ক্র্যাশ করুন
এডুয়ার্ডো অলিভারস

6

[Simulator App Folder]/Document/*.sqliteসত্ত্বায় পরিবর্তন করার পরে আমি কেবল ফাইলটি মুছলাম এবং এটি কাজ করেছে worked এবং অবশ্যই, .sqlite ফাইলটিতে সমস্ত সঞ্চিত ডেটা এবং কাঠামো রয়েছে যা হারিয়ে যাবে।


2
আমার জন্যও কাজ করেছেন। এটি যুক্তিযুক্ত মনে হয় যে এটি যথেষ্ট হওয়া উচিত। আপনি যদিও ডিবিতে ইতিমধ্যে সমস্ত ডেটা আলগা করে
রেখেছেন

6

অনুগ্রহ করে সিমুলেটর থেকে একটি অ্যাপ্লিকেশন মুছুন এবং একটি কোড পরিষ্কার করুন এবং চালিত করুন। এটি ভাল কাজ করে it এটি আপনার সাহায্য হতে পারে।


6

আপনি যদি সুইফট ব্যবহার করেন।

@ স্টাস দ্বারা উত্তর অনুসরণ করুন এবং আপনার অ্যাপ ডেলিগেটে শূন্যতার জায়গায়, বিকল্প সন্নিবেশ করান:

let myOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: myOptions, error: &error) == nil {

1
কেন কেন ভোট পড়েছে তা নিশ্চিত নয়, তবে আমি এটি যথাযথ করেছি। সুইফটের সিনট্যাক্স সরবরাহ করার জন্য ধন্যবাদ।
ম্যাট লং

নিস! এটা কাজ! ধন্যবাদ! আমি এই সমস্যাটি 3 ঘন্টা সমাধান করার চেষ্টা করছি।
mr_ivan777

এই কোডটি কোথায় রাখব? আমি কোর ডেটা লোড সঙ্গে এই কোড দিন ধারক = NSPersistentContainer (নাম: "modeldb") container.loadPersistentStores (completionHandler: {(storeDescription, ত্রুটি) যদি এলইটি ত্রুটি = NSError যেমন ত্রুটি {?
অ্যান্ড্রয়েড জন।

5

সিমুলেটরটিতে "রিসেট সামগ্রী এবং সেটিংস" চেষ্টা করুন। অ্যাপ্লিকেশন এবং ক্লিন বিল্ড মোছার পরে আমার জন্য কাজ করেছে


3
আপনি যদি এটি করেন তবে, বাস্তব মেশিনগুলির ব্যবহারকারীদের জন্য এখনও একই সমস্যা দেখা দেবে না?
মরি মারকোভিটস

4

আমি একই অ্যাপ্লিকেশনটি আমার অ্যাপ্লিকেশনটির সাথে (এখনও অ্যাপ স্টোরে প্রকাশিত হয়নি) অভিজ্ঞতা পেয়েছি।

এখানে আমি এটি ঠিক করেছি:

  1. রান ক্লিন (সিএমডি + শিফট + কে)
  2. আইওএস সিমুলেটর পুনরায় চালু করুন
  3. আইওএস সিমুলেটর -> সামগ্রী এবং সেটিংস পুনরায় সেট করুন (নাবার থেকে)

(3) হ'ল এমন পদক্ষেপ যা অবশেষে এটি সঠিকভাবে চালানোর জন্য পেল। আশাকরি এটা সাহায্য করবে!


2

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

যদি এটি হয় তবে আপনাকে নতুন স্কিমায় পুরানো ডেটা স্থানান্তর করার যত্ন নিতে হবে:

কোর ডেটা মডেল সংস্করণ এবং ডেটা মাইগ্রেশন


2

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

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html


2

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

কিছু পরিস্থিতির জন্য, কোর ডেটা পুরানো মডেল থেকে নতুনটিতে ম্যাপিংটি স্বয়ংক্রিয়ভাবে নির্ধারণ করতে সক্ষম। আরও জটিল পরিবর্তনের জন্য আপনাকে কিছু যুক্তি প্রয়োগ করতে হবে যা মাইগ্রেশন সম্পাদন করে।

বিবরণগুলি কোর ডেটা মডেল সংস্করণ এবং ডেটা মাইগ্রেশন প্রোগ্রামিং গাইডে পাওয়া যাবে

আপডেট
স্ট্যাক ওভারফ্লোতে এই উত্তরটি কোর ডেটার লাইটওয়েট মাইগ্রেশনের মূল বিষয়গুলি কভার করে এবং আপনাকে শুরু করার জন্য কিছু কোডও রয়েছে।


ডেটা মাইগ্রেশনের জন্য এখানে আমার উত্তরটি রয়েছে: স্ট্যাকওভারফ্লো
ধাওয়াল এইচ। নেনা

1

সাধারণত ডিবি তৈরি করা হয়েছে এমন সংস্করণের মধ্যে অসঙ্গতিজনিত কারণে এই সমস্যাটি ঘটে । এই সমস্যাটির সাধারণ পন্থাটি হ'ল অ্যাপটি মুছে ফেলা এবং পুনরায় ইনস্টল করা। তবে আপনার উল্লিখিত ক্ষেত্রে এক্সকোড ৩.২ এবং ৪.২ এ ডিবি-র সংস্করণ সম্পূর্ণ আলাদা। তাই ডিবিতে এক্সকোডের একই সংস্করণটি আরও ভাল ব্যবহার করুন।


1

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

দ্বিতীয়ত, ত্রুটিটি নির্দেশ করে যে কোর ডেটা আপনার মডেলটি খুঁজে পাবে না। আপনি কি ডেটা তৈরি করেছেন এবং তারপরে মডেলটিকে স্পর্শ করেছেন? যদি তা হয় তবে আপনি একটি বেমানান অবস্থায় রয়েছেন এবং ডেটা মুছে ফেলার মাধ্যমে (ফিলিপ প্রস্তাবিত) বা আপনার মডেল BACK এর পরিবর্তনগুলি ঘূর্ণন দ্বারা এটি ঠিক করতে হবে ।


আপনার কি ধারণা আছে কীভাবে আমি এক্সসিডিটামোডেল বান্ডেল থেকে মডেলটি বের করতে পারি? বা আমি কি শুধু এটিকে মুছব?
উপভোগ করুন

মডেল, যা xcdatamodelফাইল সেখানে থাকা উচিত । এটি .h এবং .m ফাইল যা সরানো দরকার। ফাইন্ডার ব্যবহার করুন।
মার্কাস এস জারা

0

আমি ত্রুটিটি পেয়েছিলাম তবে যে কারণে ত্রুটিটি পাচ্ছিলাম তা নিম্নলিখিত কারণে ছিল।

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

সম্পাদনা: ওহ এবং আপনি যদি নতুন নতুন সত্তা মুছে ফেলার বিষয়ে উদ্বিগ্ন হন (আমার ক্ষেত্রে "ব্যক্তি") আবার অ্যাপটি তৈরি করতে মনে রাখবেন আপনি পরে সিএমডি + জেড ব্যবহার করে এটি ফিরে পেতে পারবেন!


0

আমার এই সমস্যাটি ছিল - আমি প্রথমে আমার সিমুলেটরটি পুনরায় সেট করি এবং তারপরে প্রকল্পটি পরিষ্কার করে পুনর্নির্মাণ করি। এবং তারপরে এটি কাজ করে।


0

আপনি যখন মূল ডেটা পরিবর্তন করেন, (টেবিলে একটি ক্ষেত্র যুক্ত করে, ক্ষেত্র ইত্যাদি সরিয়ে ফেলুন), অ্যাপ্লিকেশন নথি ফোল্ডারে থাকা স্ক্লাইট ফাইলটি আপনার স্কিমার সাথে সুসংগত হওয়া দরকার।

এই ফাইলটি ডিফল্টরূপে ওভাররাইট করা যায় না, এই ফাইলটি পুনরায় জেনারেট করা দরকার।

এই পদক্ষেপগুলি অনুসরণ করুন:

  1. এনএসআরএল দ্বারা চিহ্নিত ফোল্ডারে যান। (এই পাথটি ক্র্যাশ হওয়ার আগে অ্যাপ্লিকেশন দ্বারা উত্পন্ন ব্যতিক্রম বার্তায় পাওয়া যেতে পারে)) উদাহরণ: / ব্যবহারকারী // গ্রন্থাগার / অ্যাপ্লিকেশন সহায়তা / আইফোন সিমুলেটর // অ্যাপ্লিকেশন // নথি

  2. স্ক্লাইট ফাইলটি মুছে ফেলুন বা নামকরণ করুন

  3. অ্যাপ্লিকেশনটি পরিষ্কার এবং পুনরায় চালু করুন
  4. পুনরায় কর্মক্ষম অ্যাপ্লিকেশনটি একটি নতুন স্ক্লাইট ফাইল তৈরি করবে।

এটি নিশ্চিত করবে যে স্কিমা এবং এক্সকোড সিঙ্কে রয়েছে।


-1

ম্যাক অ্যাপ্লিকেশন বিকাশের জন্য:

  1. প্রকল্প পরিষ্কার করুন
  2. উদ্ভূত ডেটা পরিষ্কার করুন
  3. / ব্যবহারকারী / YOUR_NAME / গ্রন্থাগার / পাত্রে / YOUR_APP_BUNDLE_ID / ডেটা / নথি / এ যান এবং ভিতরে সমস্ত ফাইল মুছুন (যেমন ".sqlite", ".sqlite-shm" ...)

এটি আমার পক্ষে কাজ করেছে, আশা করি এটি সহায়ক হতে পারে।


-2

আইওএস সিমুলেটর -> সামগ্রী এবং সেটিংস পুনরায় সেট করুন ...

আমার জন্য কাজ করেছেন

আইওএস সিমুলেটর -> সামগ্রী এবং সেটিংস পুনরায় সেট করুন ... -> আইওএস 9 (এক্সকোড 7.1) এ পুনরায় সেট করুন


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