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

У меня есть 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];

Ответ 1

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

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 it !

Ответ 2

быстрая версия ответа @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)
                }
            }
        }
    }

Ответ 3

Основываясь на ответе @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*/ }
        }
    }
}

Ответ 4

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

[managedObjectContext deleteObject:someObject];

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

Ответ 5

Извлеките файл данных и переделайте его.

Ответ 6

Существует функция

введите описание изображения здесь

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

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

Ответ 7

Самый быстрый способ отбросить все - отправить свой контекст управляемого объекта в сообщение reset.