Основные данные: Почему удаление файла sqlite не сразу очистило все предыдущие данные? - PullRequest
1 голос
/ 19 февраля 2011

Я хочу очистить хранилище данных, удалив файл sqlite приложения.Я написал эту функцию в своем классе вспомогательных данных:

-(void) resetPersistenStore {
    NSError *error = nil;
    [persistentStoreCoordinator_ release];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    if (error) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
    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();
    }
    managedObjectModel_ = nil;
}

Я поместил следующий тест в UIApplication :: didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    /* test */
    [TestDataHelper populateTestData:[self managedObjectContext]];
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [self resetPersistenStore];
    [TestDataHelper populateTestData:[self managedObjectContext]]; 
    [TestDataHelper testPopulateTestData:[self managedObjectContext]];

Вместо одного набора данных, созданного функцией populateTestData,Я могу видеть фактически три набора данных (потому что я трижды вызывал функцию)

Понятно, что resetPersistenStore () работает, потому что без него данные будут накапливаться.

Таким образом, мой вопрос:

Почему сброс не вступает в силу немедленно?

Я установил managedObjectContext равным nil в функции сброса, ноэто не помогло.

Вот моя функция populateTestData

+(void)populateTestData:(NSManagedObjectContext*)managedObjectContext {

    Stock* s1 = (Stock*)[NSEntityDescription insertNewObjectForEntityForName:@"Stock" 
                                                                     inManagedObjectContext:managedObjectContext];
    s1.code = @"ABC2";
    s1.name = @"ABC";
    s1.enteredBy = @"akong";

    [managedObjectContext save:&error]; 

    if (error) {
        NSLog(@"Data error %@", [error description]);
    } else {
        NSLog(@"Init completed");
    }
}

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Несмотря на то, что контекст сохранил данные в populateTestData, в него все равно загружены данные.

Предположим, что при запуске приложения файл содержит 3 объекта.Теперь первое сообщение populateTestData добавляет объект в контекст и сохраняет его.Итак, 4 объекта в файле, 1 в контексте.После второго сообщения 5 в файле, 2 в контексте.Теперь файл пропал, но все равно есть 2 в контексте.Теперь последнее сообщение добавляет еще один объект в контекст и в файл, так что есть 3 объекта.

Вы сказали, что установка managedObjectContext на ноль в функции сброса не помогло.Я сомневаюсь, что контекст был правильно восстановлен там.Попробуйте вместо этого [управляемый сброс объекта].

0 голосов
/ 18 марта 2011

Это может быть просто артефакт симулятора. Если вы работаете в симуляторе, вам может потребоваться сбросить его. В меню симулятора iOS выберите «Сбросить содержимое и настройки» ...

0 голосов
/ 20 февраля 2011

Я только размышляю здесь, но случайно ли вы используете fetchedResultsController для проверки / отображения результатов этих операций?Если это так, попробуйте установить его кеширование на ноль и посмотреть, поможет ли это.

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"xxxxxxxx" cacheName:nil];

Cheers, Rog

...