कोर डेटा माइग्रेशन विफल

मेरा ऐप हाल ही में ऐप स्टोर पर क्रैश हो रहा था क्योंकि मैंने डेटा माइग्रेट नहीं किया था। तो मैं इस ट्यूटोरियल का पालन कर रहा था कोर डेटा माइग्रेशन लेकिन यह काम नहीं कर रहा प्रतीत होता है:

1. मैंने कोर डेटा के लिए एक नया मॉडल संस्करण बनाया और इसे वर्तमान संस्करण में सेट किया ...

2. मैंने निम्नलिखित कोड जोड़ा:

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

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Planner.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES
                              };
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return _persistentStoreCoordinator;
}

हालांकि जब मैं अपने आईफोन पर ऐप अपडेट करता हूं तो यह अभी भी दुर्घटनाग्रस्त हो जाता है!

मेरे द्वारा किए गए परिवर्तनों में मैंने एक इकाई जोड़ा था।

क्रैश लॉग यहाँ है:

Unresolved error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error 134130.)" UserInfo=0x14fb4530 {URL=file:///var/mobile/Applications/E8C39F0E-027E-4D5B-8D7B-74D592290D46/Documents/Planner.sqlite, metadata={
    NSPersistenceFrameworkVersion = 479;
    NSStoreModelVersionHashes =     {
        Audio = ;
        Classes = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>;
        Homework = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8>;
        Notes = ;
        Picture = <451cd1a2 9daac38d 69165176 0cacb6c8 94d1e93d eca34239 61a15f35 573f7e40>;
        Tests = ;
        Video = ;
    };
    NSStoreModelVersionHashesVersion = 3;
    NSStoreModelVersionIdentifiers =     (
        ""
    );
    NSStoreType = SQLite;
    NSStoreUUID = "4327E676-759B-4733-A7ED-12309BD482EE";
    "_NSAutoVacuumLevel" = 2;
}, reason=Can't find model for source store}, {
    URL = "file:///var/mobile/Applications/E8C39F0E-027E-4D5B-8D7B-74D592290D46/Documents/Planner.sqlite";
    metadata =     {
        NSPersistenceFrameworkVersion = 479;
        NSStoreModelVersionHashes =         {
            Audio = ;
            Classes = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>;
            Homework = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8>;
            Notes = ;
            Picture = <451cd1a2 9daac38d 69165176 0cacb6c8 94d1e93d eca34239 61a15f35 573f7e40>;
            Tests = ;
            Video = ;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "4327E676-759B-4733-A7ED-12309BD482EE";
        "_NSAutoVacuumLevel" = 2;
    };
    reason = "Can't find model for source store";
}

मैंने पहले से ही मौजूदा मॉडल संस्करण सेट किया है।

किसी भी तरह की सहायता को आभार समझेंगे।

पहले ही, आपका बहुत धन्यवाद,

अब्दुल्ला शाफिक

@ स्कॉट के अनुसार मुझे अपने स्रोत में सभी बदलावों को पूर्ववत करना होगा और केवल गंतव्य को बदलना होगा

क्या कोई कृपया समझा सकता है?

0
@AhmedZ। हाँ, मैंने किया
जोड़ा लेखक Abdullah Shafique, स्रोत
जोड़ा लेखक Abdullah Shafique, स्रोत
@flexaddicted मैंने पहले से ही ऐसा किया है।
जोड़ा लेखक Abdullah Shafique, स्रोत
@flexaddicted मेरा संपादन देखें ...
जोड़ा लेखक Abdullah Shafique, स्रोत
@DuncanGroenewald मैंने एक इकाई जोड़ा
जोड़ा लेखक Abdullah Shafique, स्रोत
यहां एक नज़र डालें stackoverflow.com/questions/7624502/…
जोड़ा लेखक Lorenzo B, स्रोत
क्रैश लॉग पोस्ट कर सकता है?
जोड़ा लेखक Lorenzo B, स्रोत
लाइटवेट माइग्रेशन केवल कुछ प्रकार के बदलावों को संभाल सकता है। मॉडल में आपने क्या बदलाव किए हैं और आपको क्या त्रुटियां मिल रही हैं?
जोड़ा लेखक Duncan Groenewald, स्रोत
@AbdullahShafique क्या आपने इसे हल किया ???
जोड़ा लेखक Ahmed Z., स्रोत
@AbdullahShafique मुझे अभी भी यह मिल रहा है कि "स्रोत स्टोर के लिए मॉडल नहीं मिल रहा" त्रुटि
जोड़ा लेखक Ahmed Z., स्रोत

3 उत्तर

जब आप एक नया कोर डेटा मॉडल संस्करण जोड़ते हैं तो एक्सकोड एक और मॉडल बनाता है और आपको नए संस्करण के लिए मॉडल नाम प्रदान करने के लिए कहा जाता है। तो अब आपके पास एक्सकोड प्रोजेक्ट में दो मॉडल होना चाहिए। एक बार जब आप नया संस्करण बना लेते हैं तो आपको इसे चुनने की आवश्यकता होती है और इसे एप्लिकेशन द्वारा उपयोग किए जाने वाले वर्तमान संस्करण के रूप में सेट करने की आवश्यकता होती है। आप प्रोजेक्ट में मॉडल का पुराना संस्करण रखते हैं।

कोर डेटा को आपकी मौजूदा फाइलों को खोलने के लिए मॉडल के पुराने संस्करण (स्रोत स्टोर के लिए मॉडल) की आवश्यकता है। इसके बाद डेटा को नए स्कीमा (या मॉडल) में स्थानांतरित करके माइग्रेशन किया जाएगा।

तो उपर्युक्त त्रुटि इंगित करती है कि आपने अनजाने में मॉडल के मूल संस्करण में बदलाव किए हैं (शायद नए संस्करण में बदलाव के अलावा)। हालांकि कोर डेटा सही मॉडल संस्करण के बिना फ़ाइल खोलने में असमर्थ है, इसलिए आपको मूल कोर डेटा मॉडल की एक प्रति को पुनर्स्थापित करने की आवश्यकता है। यदि आपने जो कुछ किया है, वह नए मॉडल में एक नई इकाई जोड़ रहा है, तो जांचें कि क्या इस नई इकाई को अनजाने में पुराने मॉडल में जोड़ा गया है और यदि ऐसा है तो इसे मॉडल के पुराने संस्करण से हटा दें।

0
जोड़ा
हाँ एक ही त्रुटि और दुर्घटना :(
जोड़ा लेखक Abdullah Shafique, स्रोत
आपकी मदद के लिए बहुत बहुत धन्यवाद लेकिन यह अभी भी दुर्घटनाग्रस्त है।
जोड़ा लेखक Abdullah Shafique, स्रोत
हाँ मेरे पास एक प्रति है
जोड़ा लेखक Abdullah Shafique, स्रोत
मैं पुराने मॉडल को कैसे पुनर्स्थापित कर सकता हूं?
जोड़ा लेखक Abdullah Shafique, स्रोत
अभी भी एक ही त्रुटि हो रही है? यह सुनिश्चित करने के लिए कि पुरानी फ़ाइल अभी भी सही तरीके से खोली जा सकती है, वर्तमान संस्करण को पुराने संस्करण में वापस सेट करने का प्रयास करें।
जोड़ा लेखक Duncan Groenewald, स्रोत
जोड़ा लेखक Duncan Groenewald, स्रोत
अब एक नया मॉडल संस्करण बनाएं, सुनिश्चित करें कि आपने परिवर्तन करने से पहले नया मॉडल संस्करण चुना है। ऐसा लगता है कि एक्सकोड ने अक्सर नए मॉडल का चयन किया है, जबकि वास्तव में यह सुनिश्चित करने के लिए एक बार से अधिक नए मॉडल संस्करण फ़ाइल पर क्लिक नहीं किया गया है।
जोड़ा लेखक Duncan Groenewald, स्रोत
ठीक है और मुझे लगता है कि मैन्युअल रूप से नए मॉडल को फिर से बनाने के लिए आपके लिए यह आसान है। फिर एक्सकोड पर जाएं और वर्तमान मॉडल को हटाएं (पूरे संस्करण सहित पूरे बंडल) और संदर्भ निकालें का चयन करें। अब फ़ाइल प्रबंधक का उपयोग कर प्रोजेक्ट निर्देशिका पर जाएं और मॉडल बंडल को कहीं सुरक्षित रखें! मूल मॉडल बंडल को वापस प्रोजेक्ट फ़ोल्डर में कॉपी करें और एक्सकोड पर जाएं और प्रोजेक्ट में फ़ाइलें जोड़ें का चयन करें, पुरानी मॉडल फ़ाइल का चयन करें।
जोड़ा लेखक Duncan Groenewald, स्रोत
क्या आपके पास पुराने मॉडल की एक प्रति है?
जोड़ा लेखक Duncan Groenewald, स्रोत

मॉडल संस्करणों की जांच करने और मेटाडेटा आउटपुट करने के लिए इस कोड का उपयोग करने का प्रयास करें

/*! The method checks the Core Data file version is compatible with the App's model version
    and then pushes the main menu view onto the navigation stack.  If not compatible it displays a 
    message to the user.

    @param file The file URL for the Core Data Store. With UIManagedDocument you have to get the 
                actual store file URL, you can't just use the UIManagedDocument file URL.
 */
-(voidcheckCoreDataFileVersion:(NSURL*)file
{
    if ([self checkVersion:file]) {

       //file version is compatible so continue (add code to push the menu view)


    } else {

       //file version is NOT compatible

        _fileOpenErrorAlert = [[UIAlertView alloc] initWithTitle:@"Unable to open Document" message:@"Please check that you have the correct application version installed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [_fileOpenErrorAlert show];

    }
    return;
}
/*! Checks the Core Data files models version against the apps model version to see if they
    are compatible.  This will return YES if a lightweight migration can be performed and NO if NOT.

    @param fileURL The file URL for the Core Data Store. With UIManagedDocument you have to get the
                actual store file URL, you can't just use the UIManagedDocument file URL.
    @return  Returns YES if they are compatible and NO if not.
 */
- (bool)checkVersion:(NSURL*)fileURL {

    NSManagedObjectModel *model = [self managedObjectModel];

    NSLog(@" app model entity version hashes are %@", [model entityVersionHashesByName]);

    NSError *error;
    NSDictionary *metaData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:fileURL error:&error];

    if (!metaData) {
        NSLog(@“ problem getting metaData");
        NSLog(@“  - error is %@, %@", error, error.userInfo);
        return NO;
    }

    bool result = [model isConfiguration:nil compatibleWithStoreMetadata:metaData];
    if (!result) {
       NSLog(@“ file is not compatible!");
       NSLog(@“ metadata is %@", metaData);
    }

    return result;

}
0
जोड़ा
<कोड> मेटाडेटा {NSPersistenceFrameworkVersion = 479 है; NSStoreModelVersionHashes = {ऑडियो = ; कक्षाएं = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>; होमवर्क = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8> ...;
जोड़ा लेखक Abdullah Shafique, स्रोत
फ़ाइल संगत नहीं है!
जोड़ा लेखक Abdullah Shafique, स्रोत
मैंने कोड की लाइनें जोड़ दीं और जब मैंने प्रोजेक्ट चलाया तो मुझे ये लॉग मिला:
जोड़ा लेखक Abdullah Shafique, स्रोत
यह वह लॉग है जिसे मैं वापस प्राप्त कर रहा हूं:
जोड़ा लेखक Abdullah Shafique, स्रोत
<कोड> ऑडियो = ; कक्षाएं = <3b64e147 eb41441b 73bf051f ce094443 2017845b 2faba1c7 47848618 9fd9713b>; होमवर्क = <4295bdbf 75862060 c7f1a501 3b0934cd 9811e838 bc40c5d5 05f8d383 f315d1f8>; नोट्स = ; चित्र = <451cd1a2 9daac38d 69165176 0cacb6c8 94d1e93d eca34239 61a15f35 573f7e40>; टेस्ट = ; वीडियो = <774f4a4a 2ed26588 985c4659 9a3df9b7 41e596aa ada87a91 47a19bba 4a0a52b2>;
जोड़ा लेखक Abdullah Shafique, स्रोत
क्या मैं अपने ऐपडिलेगेट में कोड की इन पंक्तियों को डालता हूं
जोड़ा लेखक Abdullah Shafique, स्रोत
मेरे पुराने संस्करण में मैंने वीडियो नामक एक नई इकाई को जोड़ा
जोड़ा लेखक Abdullah Shafique, स्रोत
वैसे भी इसे ठीक करने के लिए?
जोड़ा लेखक Abdullah Shafique, स्रोत
जोड़ा लेखक Duncan Groenewald, स्रोत
ठीक है तो किसी भी तरह से आपने वीडियो इकाई को बदल दिया है क्योंकि स्टोर में संस्करण ऐप मॉडल में संस्करण के समान नहीं है। कड़ी मेहनत करो - तुमने क्या किया?
जोड़ा लेखक Duncan Groenewald, स्रोत
ठीक है अब लाइन के नीचे निम्न पंक्ति जोड़ें जहां ऐप मॉडल सेट किया गया है 'NSLog (@ "ऐप मॉडल इकाई संस्करण हैश% @", [मॉडल इकाई वर्जन हैशबिननाम]); 'फिर आप एप वर्जनशैश की तुलना स्टोर संस्करण हैश से तुलना कर सकते हैं यह देखने के लिए कि कौन सी संस्थाएं समान नहीं हैं।
जोड़ा लेखक Duncan Groenewald, स्रोत
ओह - पिछली कुछ पंक्तियों में एक त्रुटि हुई जहां परिणाम कोड की जांच किए बिना LOG आउटपुट लिखा जा रहा था - मैंने अभी अपडेट किया है कि if (! परिणाम) लाइन शामिल करने के लिए।
जोड़ा लेखक Duncan Groenewald, स्रोत
वैसे आपको checkCoreDataFileVersion: को लगातार बनाए रखने से पहले कहीं भी कॉल करना होगा: storeURL के लिए मान सेट करने के बाद बस इसे सीधे कॉल करें और storeURL ।
जोड़ा लेखक Duncan Groenewald, स्रोत

त्रुटि कहती है:

"स्रोत स्टोर के लिए मॉडल नहीं मिल रहा है";

ऐसा लगता है कि आपने पिछले मॉडल को भी संशोधित किया है और हैश को पुन: उत्पन्न किया गया था। और वे मेल नहीं खाते हैं, और स्रोत स्टोर के लिए उस मॉडल के कारण नहीं मिल सकता है।

0
जोड़ा
@ Vytautas मैं इन सभी सवालों के लिए बहुत खेद है लेकिन मैं बहुत उलझन में हूँ
जोड़ा लेखक Abdullah Shafique, स्रोत
@ स्कॉट मैं इन सभी सवालों के लिए बहुत खेद है लेकिन मैं बहुत उलझन में हूं
जोड़ा लेखक Abdullah Shafique, स्रोत
@Vytautas मैं पुराने मॉडल फ़ाइल को पूर्ववत कैसे करूं?
जोड़ा लेखक Abdullah Shafique, स्रोत
@ स्कॉट क्या आप कृपया यह बता सकते हैं कि ऐसा कैसे करें? तुम्हारी सहायता सराहनीय है।
जोड़ा लेखक Abdullah Shafique, स्रोत
हालांकि मैं इसे कैसे ठीक कर सकता हूं?
जोड़ा लेखक Abdullah Shafique, स्रोत
@ अब्दुल्लाशफिक: अपने स्रोत में सभी बदलावों को पूर्ववत करें और केवल गंतव्य (अपना नया मॉडल संस्करण) बदलें
जोड़ा लेखक Scott Berrevoets, स्रोत
@AbdullahShafique: मुझे उम्मीद है कि आप एससीएम उपकरण (गिट, एसवीएन, ...) का उपयोग कर रहे हैं, तो आप पिछली कोर डेटा मॉडल फ़ाइल (आपके परिवर्तन से पहले मॉडल फ़ाइल संस्करण) को रीसेट (या चेकआउट) कर सकते हैं। और फिर सबकुछ खरोंच से शुरू करें या वर्तमान समस्या को ठीक करें। क्योंकि आपके परिवर्तन से पहले, आपके पास कोर डेटा मॉडल का केवल एक संस्करण था। लेकिन सबसे पहले पुरानी मॉडल फ़ाइल में पूर्ववत करने का प्रयास करें, हो सकता है कि आपके पास अभी भी पूर्ण पूर्ववत इतिहास हो।
जोड़ा लेखक Vytautas, स्रोत