objective c - एक NSPersistentDocument का हल्का प्रवास

Translate

मैं कोर डेटा में एक SQLite स्टोर का एक हल्का माइग्रेशन करने की कोशिश कर रहा हूं। Xcode 4.3.1 के साथ लॉयन 10.7.3 पर काम कर रहा है।

मेरे NSPersistentDocument उपवर्ग (AccountDocument) में, मैंने लगातार स्टोर संयोजक को कॉन्फ़िगर करने के लिए उपयोग की जाने वाली विधि को ओवरराइड कर दिया है ताकि उसे माइग्रेशन के लिए उचित विकल्प मिलें:

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    NSMutableDictionary *newStoreOptions;
    if (storeOptions == nil) {
        newStoreOptions = [NSMutableDictionary dictionary];
    }
    else {
        newStoreOptions = [storeOptions mutableCopy];
    }
    [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error];
    return result;
}

(उस टिप के लिए मैल्कम क्रॉफर्ड का धन्यवाद:http://homepage.mac.com/mmalc/CocoaExamples/controllers.html)

जब मैं एप्लिकेशन चलाता हूं, तो यह NSPersistentDocument के कार्यान्वयन में विफल हो जाता है-managedObjectModel:

* thread #1: tid = 0x2703, 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16, stop reason = EXC_BAD_ACCESS (code=13, address=0x0)
    frame #0: 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16
    frame #1: 0x00007fff8935e975 CoreData`-[NSKnownKeysDictionary1 _setValues:retain:] + 197
    frame #2: 0x00007fff8935f288 CoreData`_newReadModelFromBytes + 648
    frame #3: 0x00007fff8935b93e CoreData`+[NSManagedObjectModel(_NSManagedObjectModelPrivateMethods) _newModelFromOptimizedEncoding:error:] + 9310
    frame #4: 0x00007fff89359451 CoreData`-[NSManagedObjectModel(_NSManagedObjectModelPrivateMethods) initWithContentsOfOptimizedURL:] + 305
    frame #5: 0x00007fff89358d7b CoreData`-[NSManagedObjectModel initWithContentsOfURL:] + 443
    frame #6: 0x00007fff893e9519 CoreData`+[NSManagedObjectModel mergedModelFromBundles:] + 377
    frame #7: 0x00007fff8ded7037 AppKit`-[NSPersistentDocument managedObjectModel] + 301
    frame #8: 0x00007fff8ded70b3 AppKit`-[NSPersistentDocument managedObjectContext] + 75
    frame #9: 0x00007fff8ded6e3f AppKit`-[NSPersistentDocument _persistentStoreCoordinator] + 18
    frame #10: 0x00007fff8ded6b5d AppKit`-[NSPersistentDocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 51
    frame #11: 0x0000000100003193 BeanCounter`-[AccountDocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 419 at AccountDocument.m:298

प्रलेखन से मैं जो बता सकता हूं, उसमें से डिफ़ॉल्ट कार्यान्वयन कुछ इस तरह दिखता है:

- (id)managedObjectModel
{
    NSManagedObjectModel *result = [NSManagedObjectModel mergedModelFromBundles:nil];
    return result;
}

इसलिए इस समस्या को थोड़ा और दूर करने के लिए, मैं इस पद्धति को इस पर हावी करता हूं:

- (id)managedObjectModel
{
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *url = [bundle URLForResource:@"AccountDocument2" withExtension:@"momd"];
    NSManagedObjectModel *result = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease];  
    return result;
}

(इस विचार के लिए जेफ लामार्चे को धन्यवाद:http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html)

बंडल और url उन स्थानों की ओर इंगित करता है जिनकी मुझे अपेक्षा है (और मैंने प्रोजेक्ट को साफ करने के लिए मार्कस ज़रा की सलाह का पालन किया है ताकि आवेदन पैकेज में कोई आवारा .mom या .mom बंडल न हों।मर्ज किए गए ModelFromBundles का उपयोग करना: और संस्करणकरण (CoreData)) है। फिर भी url से मॉडल लोड करते समय ऐप क्रैश होता रहता है।

मैंने जाँच की है कि AccountDocument2.xcdatamodeld एक ऐसा पैकेज है जिसमें संस्करणकरण के लिए दो मॉडल हैं: AccountDocument 2.xcdatamodel और (मूल) AccountDocument.xcdatamodel। फ़ाइल गुणों में "संस्करणित कोर डेटा मॉडल" पॉपअप मेनू "खाता 2" पर सेट है।

दोनों मॉडलों के बीच एकमात्र अंतर यह है कि एक एंटिटी में एक अतिरिक्त (और वैकल्पिक) विशेषता है। मेरी समझ यह है कि एक हल्के प्रवास के लिए मॉडल को योग्य बनाता है।

जाहिर है, मैं यहां कुछ गलत कर रहा हूं, लेकिन मुझे कुछ पता नहीं है। कोई भी सहायता सराहनीय होगी…

अपडेट करें:

मार्टिन के सुझाव के अनुसार (और NSPersistentDocument प्रलेखन की जांच) मैंने एक्सेसर के लिए इस कोड का उपयोग करने की कोशिश की:

- (id)managedObjectModel
{
    static id sharedManagedObjectModel = nil;

    if (sharedManagedObjectModel == nil) {
        NSBundle *bundle = [NSBundle mainBundle];
        NSURL *url = [bundle URLForResource:@"AccountDocument2" withExtension:@"momd"];
        sharedManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
    }

    return sharedManagedObjectModel;
}

अभी भी दुर्घटनाग्रस्त ...

अपडेट करें

ट्विटर पर कुछ सुझावों के बाद, मैंने Xcode 4.3.2 में अपग्रेड किया, लेकिन समस्याएं बनी हुई हैं।

अद्यतन अद्यतन

मैंने अभी वर्जन मॉडल पैकेज (AccountDocument2.xcdatamodeld) को स्नो लेपर्ड पर Xcode 4.2 का उपयोग करके बनाया है। ऐप बनाने और चलाने के बाद, सब कुछ उम्मीद के मुताबिक काम करता है।

मैंने फिर AccountDocument2.xcdatamodeld फ़ाइल पैकेज को सिंह और Xcode 4.3.2 पर वापस ले लिया। जब मैं एप्लिकेशन बनाता और चलाता हूं, तो यह .momd संसाधन लोड करते समय क्रैश करता रहता है। हां बच्चे, इसका मतलब है कि Xcode 4.3.x और डेटा मॉडल कंपाइलर (MOMC) को दोष देना है। मुझे स्नो लेपर्ड पर अपने सभी निर्माणों को करने के अलावा एक वर्कअराउंड नहीं दिखता है।

मैं Xcode 4 को कोसने वाला नहीं हूं, लेकिन जब हम खुद को ऐसी स्थिति में पाते हैं, जहां टूलकिन एक अपारदर्शी विनिर्देश (.xcdatamodel और .xcdatamodeld) से एक अपारदर्शी फ़ाइल (.mom और .momd) का उत्पादन नहीं कर सकती है तो यह बहुत कठिन है। मैक और आईओएस टूल की स्थिति के बारे में उत्साहित रहें। यह हास्यास्पद है कि इन प्लेटफार्मों का एक मुख्य घटक उस सीमा तक टूट जाता है जहां मैं एसडीके और डेवलपर टूल के नवीनतम संस्करण पर अपना ऐप नहीं बना सकता और चला सकता हूं।

यह इस अद्यतन के लिए आ रहा है

अधिक सबूत है कि यह Xcode 4.3.2 में डेटा मॉडल कंपाइलर (MOMC) के साथ एक गंभीर बग है: अगर मैं अपने प्रोजेक्ट में Xcode 4.2 द्वारा बनाए गए संसाधन फ़ोल्डर से .momd बंडल की प्रतिलिपि बनाता हूं और उन्हें प्रतिलिपि फ़ाइलों के रूप में बिल्ड में जोड़ता हूं चरण का निर्माण, आवेदन ठीक काम करता है।

मैंने कुछ परीक्षण भी किए, जहाँ मैंने विभिन्न संस्थाओं की विशेषताओं के लिए सत्यापन नियम और डिफ़ॉल्ट मानों को हटा दिया (नीचे दिए गए मार्क के सुझाव के आधार पर।) कोई परिवर्तन नहीं, कंपाइलर अभी भी एक अमान्य .momd बनाता है। मैं भी एक संस्करण मॉडल बनाने की कोशिश की, जहां कुछ भी नहीं बदला गया था: संकलित .momd दुर्घटनाग्रस्त होता रहा। तो आपके वर्तमान मॉडल में जो कुछ भी है (और डेटा वे प्रतिनिधित्व करते हैं) समस्या का स्रोत है।

नोट का भी: यह बग NSPersistentDocument के लिए अलग-थलग नहीं है (जैसा कि मैंने मूल रूप से सोचा था कि जब मैंने यह सवाल शुरू किया था।) मैं सिर्फ उपयोग करके ऐप को क्रैश करने का कारण बन सकता हूं।[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL].

अभी के लिए, मैं अपने मॉडलों का संपादन / संस्करण स्नोड तेंदुए पर Xcode 4.2 का उपयोग करके और संकलित संसाधनों को Xcode 4.3.2 से शेर पर ले कर करूँगा। यदि आप किसी भी तरह से Core Data का उपयोग करते हैं, तो मेरा सुझाव है कि जब तक यह बग संबोधित नहीं किया जाता है, आप ऐसा ही करें। मेरा विश्वास करो, तुम दिन बिताने की कोशिश करोगे कि क्या हो रहा है अगर तुम नहीं हो।

अब एक रडार प्रस्तुत करने के लिए ...

रडार अद्यतन

मैंने अभी-अभी यह रडार प्रस्तुत किया है:

http://www.openradar.me/11184500

ओह बकवास यह शेर अद्यतन होना चाहिए

मैंने अभी-अभी लायन टूल्स के लिए Xcode 4.2 को डाउनलोड और इंस्टॉल किया हैhttp://developer.apple.com/downloads। रडार में उपयोग किया गया नमूना अनुप्रयोग अभी भी क्रैश हो जाता है।

(नोट: आप Xcode 4.2.1 स्थापित नहीं कर सकते क्योंकि DeveloperTools.pkg पर हस्ताक्षर करने के लिए उपयोग किए गए प्रमाणपत्र की समय सीमा समाप्त हो गई है। केवल X 4.2 4.2 काम करेगा।)

यदि आप एनडीए के अधीन हैं तो आप यह भी पाएंगे कि बीटा उपकरण सहायक नहीं हैं।

आशा है कि आपके पास Xcode 4.2 के साथ स्नो लेपर्ड की एक प्रति है जो चारों ओर बैठे हैं:http://furbo.org/2012/03/28/vmware-for-developers/

डब्ल्यूटीएफ डू वर्चस रिक्वेस्ट को वर्जन एंटिटीज और अटैचमेंट अपडेट के साथ करना होता है

ट्विटर पर वाया एवडेन वू:

https://twitter.com/#/evadne/status/187625192342818818

और उसने यह कैसे किया:

https://twitter.com/#//adadne/status/187629091518816258

(.mom फाइलें बाइनरी प्लिस्ट हैं।)

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

This question and all comments follow the "Attribution Required."

सभी उत्तर

Translate

संकलित .momd संसाधनों को "मौजूदापार्टनर" लाने के बाद लोड किया जा सकता है।

name == $name

सेवा:

name == $NAME

यह उल्टा है कि ऑब्जेक्ट मॉडल का एक हिस्सा जो डेटा की दृढ़ता को प्रभावित नहीं करता है संस्करण और हल्के प्रवासन को तोड़ता है। यह दस्तावेज से स्पष्ट है कि यह मामला नहीं होना चाहिए:

वर्जनिंग पर कोर डेटा का परिप्रेक्ष्य यह है कि यह केवल मॉडल की उन विशेषताओं में रुचि रखता है जो दृढ़ता को प्रभावित करती हैं।

की शक्ति का उपयोग करेंCHOCKLOCKअपने फ़ेच अनुरोधों को ठीक करने या उन्हें पूरी तरह से हटाने और भरोसा करने के लिएकोड में बनाए गए NSPredicates.

स्रोत
Translate

मुझे लगता है कि आपको एक प्रबंधित चर में प्रबंधित ऑब्जेक्ट मॉडल को संग्रहीत करने की आवश्यकता है। आप एक ऑटोरेल्ड ऑब्जेक्ट लौटा रहे हैं, जो कि शायद खराब पहुंच का कारण है।

स्रोत
Translate

आपके सिद्धांत के आधार पर कि यह MOMC के साथ एक मुद्दा है, क्या आपके पास माँ में कोई मान्यता नियम हैं?

मैंने रिपोर्ट देखी है कि सत्यापन नियम 4.x MOMC से बचे नहीं हैं।

स्रोत
Z S
Translate

यह कुछ हद तक एक मुद्दे से संबंधित हो सकता है, जो IOS5 पहली बार बीटा में आने पर फ़िच अनुरोधों का उपयोग करने के साथ था। यह एक बिल्ड चेतावनी का कारण बन रहा था और लॉन्च पर ऐप को क्रैश कर देगा। मैं वास्तव में लाने के अनुरोध का उपयोग नहीं कर रहा था, इसलिए मैंने इसे हटा दिया और सब कुछ ठीक हो गया:कोर डेटा चेतावनी: "संस्करण हैश जानकारी सभी मॉडलों के लिए उपलब्ध नहीं है"

स्रोत
Leave a Reply
You must be logged in to post a answer.
लेखक के बारे में