2012-03-06 11 views
7

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

विभिन्न पदों मैं

  • को इस विषय सामान्य रणनीति है पर का सामना करना पड़ा के आधार पर पता चलता है कि मॉडल
  • हटाना (managedObjectContext की आरंभीकरण के दौरान अपवाद को पकड़ने के द्वारा) बदल गया है लगातार दुकान (आईओएस पर हमारे मामले SQLite फ़ाइल में)
  • एक objectModel reinitialize के साथ नवीनतम स्कीमा नए मॉडल
साथ एक लगातार दुकान reinitialize

इस कोड है कि objectModel

- (NSManagedObjectModel *)managedObjectModel { 

if (managedObjectModel != nil) { 
    return managedObjectModel; 
} 

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

return managedObjectModel; 
} 

और objectModel पुनः reinitializes और

objectManager = [RKObjectManager objectManagerWithBaseURL: 
        [NSString stringWithFormat:@"http://%@/v3", 
         [[NSBundle mainBundle] objectForInfoDictionaryKey:@"APIDomain"]]];  
NSManagedObjectModel *objectModel = [self managedObjectModel]; 
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:storeName usingSeedDatabaseName:nil managedObjectModel:objectModel delegate:nil]; 

हालांकि साथ की दुकान है, मैं निम्नलिखित त्रुटि मिलती है:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'UTCity''

मैं की तरह महसूस यह एक नया स्टोर बनाने में ऐप सफल होने के पुन: प्रारंभ करने के बाद से बहुत करीब है।

-PF

+0

इसके साथ कोई भाग्य? – CharlieMezak

उत्तर

6

मुझे लगता है कि मैं क्या आप RKManagedObjectStoreDelegate से एक विधि को लागू करने से वर्णन कर रहे हैं ऐसा करने में सक्षम किया गया है। जब लगातार स्टोर निर्माण विफल रहता है तो विधि को बुलाया जाता है। जब इस विधि को बुलाया जाता है तो मैं लगातार स्टोर को हटा देता हूं। RestKit ठीक से ठीक से प्रतीत होता है। मुझे लगता है कि अगली बार इसे नई रिक्त स्टोर बनाया गया है।

- (void)managedObjectStore:(RKManagedObjectStore *)objectStore didFailToCreatePersistentStoreCoordinatorWithError:(NSError *)error { 
    [objectStore deletePersistentStore]; 
} 

RKManagedObjectStore प्रयास प्रारंभ में लगातार दुकान बनाने के लिए है, तो आप तरीकों कि एक प्रतिनिधि वस्तु को स्वीकार करता है में से एक के माध्यम से RKManagedObjectStore के अपने उदाहरण प्रारंभ करने की आवश्यकता होगी। मैं बस अपने ऐप प्रतिनिधि में पास हो गया।

अभी तक, यह काम करने लगता है। जैसे-जैसे मैं विकास जारी रखता हूं, हम देखेंगे कि यह ऐसा करना जारी रखता है या नहीं।

+0

जैसा दिखता है '- [RKManagedObjectStore resetPersistentStores:] 'RestKit 0.20.x में बराबर हो सकता है। –

+1

यह प्रतिनिधि समारोह प्रबंधित ऑब्जेक्टस्टोर: didFailToCreatePersistentStoreCoordinatorWithError: 0.20 में चला गया प्रतीत होता है। क्या आप एक प्रतिस्थापन के बारे में जानते हैं? – mosca1337

3

माइग्रेशन विफल होने पर पूरी तरह से लगातार स्टोर को हटाने का एक समाधान है।

// Core Data Persistent Store 
    NSError *error; 
    NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Data.sqlite"]; 
    NSPersistentStore __unused *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath 
                       fromSeedDatabaseAtPath:nil 
                        withConfiguration:nil 
                          options:@{NSInferMappingModelAutomaticallyOption: @YES, NSMigratePersistentStoresAutomaticallyOption: @YES} 
                           error:&error]; 

    // Reset the persistant store when the data model changes 
    if (error) { 

     [[NSFileManager defaultManager] removeItemAtPath:storePath 
                error:nil]; 

     NSPersistentStore __unused *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath 
                        fromSeedDatabaseAtPath:nil 
                         withConfiguration:nil 
                           options:nil 
                            error:nil]; 
    } 
संबंधित मुद्दे