2011-04-23 22 views
6

मुझे अपने लगातार स्टोर को हटाने की आवश्यकता है (ऑब्जेक्ट द्वारा ऑब्जेक्ट ऑब्जेक्ट करना व्यावहारिक नहीं है क्योंकि मेरे पास 100,000 से अधिक ऑब्जेक्ट्स हैं)। मैं इस की कोशिश की है:कोर डेटा लगातार स्टोर को कैसे हटाएं

- (IBAction)resetDatabase:(id)sender { 

    NSPersistentStore* store = [[__persistentStoreCoordinator persistentStores] lastObject]; 

    NSError *error = nil; 
    NSURL *storeURL = store.URL; 

    // release context and model 
    [__managedObjectContext release]; 
    [__managedObjectModel release]; 
    __managedObjectModel = nil; 
    __managedObjectContext = nil; 

    [__persistentStoreCoordinator removePersistentStore:store error:nil]; 

    [__persistentStoreCoordinator release]; 
    __persistentStoreCoordinator = nil; 

    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 
    if (error) { 
     NSLog(@"filemanager error %@", error); 
    }  

    // recreate the stack 
    __managedObjectContext = [self managedObjectContext]; 

} 

लेकिन जब मैं बाद में दुकान में संस्थाओं को सम्मिलित करने की कोशिश मैं इस त्रुटि मिलती है:

This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation. 

अद्यतन: मैं निकालने से पहले एमओसी और माँ को रिहा की कोशिश की लगातार स्टोर लेकिन मुझे अभी भी वही त्रुटि मिलती है।

उत्तर

9

यहाँ कैसे मैं कई क्षुधा में एक "डेटा रीसेट" समारोह करते हैं। removePersistentStore का उपयोग किए बिना आप यही करने की कोशिश कर रहे हैं, जिसकी मुझे परवाह नहीं है क्योंकि मैं बाद में लगातार स्टोयर समन्वयक का पुनर्निर्माण करूंगा। फिर अगले कोर डेटा फोन श्रृंखला पारदर्शी रूप से की तरह सिंगलटन-आलसी शैली कंस्ट्रक्टर्स का उपयोग कर फिर से बनाया जाता है:

- (NSManagedObjectModel *) managedObjectModel { 
    if (!_managedObjectModel) 
    _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 
    return _managedObjectModel; 
} 
+1

वाह, मुझे लगता है कि समस्या 'हटाएं PersistentStore' थी। उस रेखा के बिना यह काम किया ... मैं उत्सुक हूँ कि क्यों। – David

+1

मुझे एक एहसास है कि कोर डेटा गुणों का उपयोग करते समय .sqlite फ़ाइल को हटाकर बहुत सारे कचरे के पीछे छोड़ दिया जाएगा जो "बाहरी संग्रहण की अनुमति दें"। – magma

+0

मैग्मा सही है, यदि आप iCloud का उपयोग करते हैं तो आदि समस्याएं होती हैं। –

2

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

[[CoreDataSingleton sharedManager] managedObjectContext]; //be sure to create the store first! 

//Find targeted mom file in the Resources directory 
NSString *momPath = [[NSBundle mainBundle] pathForResource:@"Parking" ofType:@"mom"]; 
NSLog(@"momd path: %@",momPath); 

आशा है कि मदद करता है!

2

आपको यह सुनिश्चित करने की ज़रूरत है कि स्टोर को हटाने का प्रयास करने से पहले लगातार स्टोर से जुड़े किसी भी प्रबंधित ऑब्जेक्ट संदर्भ को रिलीज़ किया गया हो। अन्यथा, संदर्भ उस त्रुटि को उजागर करेगा।

- (void)reset { 
    // Release CoreData chain 
    [_managedObjectContext release]; 
    _managedObjectContext = nil; 
    [_managedObjectModel release]; 
    _managedObjectModel = nil; 
    [_persistentStoreCoordinator release]; 
    _persistentStoreCoordinator = nil; 

    // Delete the sqlite file 
    NSError *error = nil; 
    if ([fileManager fileExistsAtPath:_storeURL.path]) 
    [fileManager removeItemAtURL:_storeURL error:&error]; 
    // handle error... 
} 

असल में मैं सिर्फ CoreData श्रृंखला जारी है, तो persistentStore फ़ाइल को नष्ट:

+0

मैंने कोशिश की है कि कोई लाभ नहीं हुआ (अद्यतन कोड देखें)। – David

संबंधित मुद्दे