Как удалить все объекты из моего постоянного хранилища в Core Data? - PullRequest
16 голосов
/ 04 марта 2010

В моем приложении работают Core Data. Итак, я извлекаю файл XML, анализирую данные в объектах модели и вставляю их в основные данные. Они сохраняются в постоянном хранилище, и я могу получить к ним доступ при перезапуске приложения. Однако я хочу иметь возможность обновлять данные в постоянном хранилище по желанию, поэтому мне нужно сначала удалить существующие объекты из хранилища. Есть ли прямой метод для этого?

Спасибо


Я нашел это решение:

[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error])
{
NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]];
[[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil];
[self addPersistentStore];//recreates the persistent store
}
[managedObjectContext unlock];

Ответы [ 7 ]

62 голосов
/ 12 декабря 2011

Вот что я сделал, чтобы полностью очистить мои базовые данные. Работает отлично. Это если у вас есть только одно постоянное хранилище, что, вероятно, имеет место, если вы не добавили еще одно хранилище вручную. Если ваш managedObjectContext имеет то же имя, что и здесь, вы можете просто скопировать / пропустить его.

NSError * error;
// retrieve the store URL
NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{
    // remove the file containing the data
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    //recreate the store like in the  appDelegate method
    [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store
}
[managedObjectContext unlock];
//that's it !
7 голосов
/ 08 мая 2015

быстрый вариант ответа @Nicolas Manzini:

if let psc = self.managedObjectContext?.persistentStoreCoordinator{

        if let store = psc.persistentStores.last as? NSPersistentStore{

            let storeUrl = psc.URLForPersistentStore(store)

            self.managedObjectContext?.performBlockAndWait(){

                self.managedObjectContext?.reset()

                var error:NSError?
                if psc.removePersistentStore(store, error: &error){
                    NSFileManager.defaultManager().removeItemAtURL(storeUrl, error: &error)
                    psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: nil, error: &error)
                }
            }
        }
    }
6 голосов
/ 01 января 2016

На основе ответа @Nicolas Manzini я написал версию Swift 2.1 с небольшими улучшениями. Я добавил расширение к NSManagedObjectContext. Полный код ниже:

import Foundation
import CoreData

extension NSManagedObjectContext
{
    func deleteAllData()
    {
        guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else {
            return
        }

        guard let url = persistentStoreCoordinator?.URLForPersistentStore(persistentStore) else {
            return
        }

        performBlockAndWait { () -> Void in
            self.reset()
            do
            {
                try self.persistentStoreCoordinator?.removePersistentStore(persistentStore)
                try NSFileManager.defaultManager().removeItemAtURL(url)
                try self.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
            }
            catch { /*dealing with errors up to the usage*/ }
        }
    }
}
1 голос
/ 14 сентября 2017

Есть функция

enter image description here

Согласно WWDC 242 , вы можете использовать его для очистки базы данных.

Также существует func replacePersistentStore, который заменяет текущую базу данных выбранной.

1 голос
/ 04 марта 2010

Очистите ваш файл данных и переделайте его.

1 голос
/ 04 марта 2010

Вы можете перебрать все объекты и удалить их, выполнив следующее:

[managedObjectContext deleteObject:someObject];

Если вы хотите удалить все объекты, вероятно, быстрее всего будет удалить хранилище, а затем заново создать стек CoreData.

0 голосов
/ 04 марта 2010

Самый быстрый способ избавиться от всего, это отправить контексту управляемого объекта сообщение <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html#//apple_ref/occ/instm/NSManagedObjectContext/reset" rel="nofollow noreferrer">reset</a>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...