Как удалить все объекты из моего постоянного хранилища в 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
.