По сути, я пытаюсь стереть все данные в моем постоянном хранилище CoreData, а затем импортировать новые данные. Как бы вы это сделали? Кажется, что самое простое решение - вызвать [NSPersistentStoreCoordinator removePersistentStore:error:]
, а затем удалить файл. Это лучшая практика? Это потокобезопасно?
Большое спасибо,
#
Вопрос 0.1: был
Я пытаюсь обновить данные в постоянном хранилище CoreData. Мой пользователь видит табличное представление со статистическими данными. Я хочу обновить приложение, удалив все существующие данные, а затем импортировав новые данные. Я хотел бы показать прогресс, чтобы сообщить пользователю, что приложение не зависает.
Я добавил следующий метод resetPersistentStore
в мой AppDelegate (persistentStoreCoordinator
дан для справки):
// ...
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
// ...
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: kPersistentStoreFilename]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
/**
* Will remove the persistent store
*/
- (NSPersistentStoreCoordinator *)resetPersistentStore {
NSError *error;
[managedObjectContext lock];
// FIXME: dirty. If there are many stores...
NSPersistentStore *store = [[persistentStoreCoordinator persistentStores] objectAtIndex:0];
if (![persistentStoreCoordinator removePersistentStore:store error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
// Delete file
if (![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
// Delete the reference to non-existing store
[persistentStoreCoordinator release];
persistentStoreCoordinator = nil;
NSPersistentStoreCoordinator *r = [self persistentStoreCoordinator];
[managedObjectContext unlock];
return r;
}
Тогда, на мой взгляд, я делаю (в другой теме, так как я использую MBProgressHUD
:
PatrimoineAppDelegate *appDelegate = (PatrimoineAppDelegate *)[[UIApplication sharedApplication] delegate];
// Delete everything
[appDelegate resetPersistentStore];
И я получаю EXC_BAD_ACESS
...
Я не очень хорошо знаю CoreData или многопоточность, возможно я делаю явную ошибку ...