Как очистить /reset все отношения CoreData в отношениях один-ко-многим
Я использую coreData, с одним-большим количеством realtionship, у меня есть сущность папки и файловая сущность. В папке может быть много файлов и т.д.
Итак, у меня есть два ViewControllers, FolderViewController и FileViewController, которые содержат папки и файлы соответственно. Теперь у меня есть modalView, доступный как из диспетчера просмотра файлов, так и из файла. В этом VC у меня есть кнопка для Reset всех данных. Поэтому, когда я нажимаю это, мне нужны все данные reset.
Я использовал этот код, эта функция написана в appdelegate.m и вызывается из моего VC.
- (void)resetToDefault
{
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 !
NSLog(@"buttonReset Pressed");
}
Итак, после нажатия кнопки resetButton, когда я закрываю View, я получаю эту ошибку
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object persistent store is not reachable from this NSManagedObjectContext coordinator'
Итак, как это решить.
Отношения
Ранджит
Ответы
Ответ 1
Я решил эту проблему, ниже - код,
Эта функция была написана в appdelegate.m
- (void) resetApplicationModel
{
NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
[self.managedObjectContext deleteObject:ct];
}
//Make new persistent store for future saves
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
}
И в моем SettingsViewController, я вызываю это на resetbutton, нажав таким образом.
- (void)resetButtonclicked
{
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate resetApplicationModel];
}
Отношения
Ранджит.
Ответ 2
NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
// Then, just add the persistent store back to ensure it is recreated properly.
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}