Файл SQLite не обновляется после создания с помощью Core Data после изменения стека Core Data

Я изменил свой существующий основной стек, и мой файл sqlite больше не обновляется после его создания. Я могу сохранять и извлекать данные с основными данными, но файл sqlite всегда пуст (вместо этого обновляется файл sqlite-shm). Моя реализация неверна? Что мне нужно сделать, чтобы обновить файл sqlite?

//заголовочный файл

@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectContext *masterManagedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectContext *mainManagedObjectContext;

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator;
-(NSManagedObjectModel *)managedObjectModel;
-(NSManagedObjectContext *)masterManagedObjectContext;
-(NSManagedObjectContext *)mainManagedObjectContext;
-(NSManagedObjectContext *)workerManagedObjectContext;

//файл реализации

@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
@synthesize masterManagedObjectContext = __masterManagedObjectContext;
@synthesize mainManagedObjectContext = __mainManagedObjectContext;



//Managed object context
-(NSManagedObjectContext *)masterManagedObjectContext{
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        __masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [__masterManagedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __masterManagedObjectContext;
}

- (NSManagedObjectContext *)mainManagedObjectContext {
    if (__mainManagedObjectContext != nil) {
        return __mainManagedObjectContext;
    }

    __mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [__mainManagedObjectContext setParentContext:self.masterManagedObjectContext];
    return __mainManagedObjectContext;
}

- (NSManagedObjectContext *)workerManagedObjectContext {

    NSManagedObjectContext *tempMOContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    tempMOContext.parentContext = [self mainManagedObjectContext];
    return tempMOContext;
}

//Save methods

- (void)saveWorkerContext:(NSManagedObjectContext *)context {
    NSError *error;
    [context save:&error];
    if (!error) {
    [self saveMainContext];
    }
}

- (void)saveMainContext {
    [self.mainManagedObjectContext performBlock:^{
        NSError *error = nil;
        [self.mainManagedObjectContext save:&error];
        if(!error){
            //Write to disk after saving on the main UI context
            [self saveMasterContext];
        }
    }];
}

- (void)saveMasterContext {

    [self.masterManagedObjectContext performBlock:^{
        NSError *error = nil;
        [self.masterManagedObjectContext save:&error];
        if(error){
            NSLog(@"CORE DATA MASTER CONTEXT ERROR : %@", error);
        }
    }];
}

-(NSManagedObjectModel *)managedObjectModel {
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }

    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MyResource"
                                                       ofType:@"bundle"];

    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    NSString *modelPath = [bundle pathForResource:@"MyData"
                                       ofType:@"momd"];
    //NSLog(@"Bundle modelURL:%@",modelPath);
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    __managedObjectModel = [[NSManagedObjectModel alloc]     initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}


-(NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (__persistentStoreCoordinator != nil) {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyData.sqlite"];
    //NSLog(@"storeURL:%@",storeURL);
    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;
}

- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

//пример попытки сохранить данные

-(void)saveDictionary:(NSMutableDictionary *)myDictionary{

    NSManagedObjectContext *context = [self workerManagedObjectContext];
    [context performBlockAndWait:^{

        NSMutableDictionary *tmpDic = myDictionary;
        NSError *error;
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity"
                                              inManagedObjectContext:context];

        [fetchRequest setEntity:entity];
        NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

        Entity *myEntity;

        if ([fetchedObjects count]>0) {
            myEntity = [fetchedObjects lastObject];
        }
        else{
            myEntity = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context];
        }

        myEntity.value = tmpDic[@"value1"]!=nil?tmpDic[@"value1"]:@"nothing";


        [self saveWorkerContext:context];
    }];
}

person iamarnold    schedule 04.02.2016    source источник


Ответы (2)


Что мне нужно сделать, чтобы заставить это работать?

Но вы также сказали

Я могу сохранять и извлекать данные с основными данными...

Это определение «работы» с Core Data. Если это сработает, все готово.

Файл SQLite shm — это журнал SQLite. Это деталь реализации того, как работает SQLite. Вы можете прочитать как SQLite управляет своими файлами, если вам интересно, но на самом деле это не так. релевантно тому, что вы делаете.

person Tom Harrington    schedule 04.02.2016
comment
Может быть, мне следует изменить свой вопрос с Что мне нужно сделать, чтобы заставить это работать? to Что мне нужно сделать, чтобы обновить файл sqlite? чтобы было понятнее? - person iamarnold; 05.02.2016
comment
Почему вы хотите, чтобы он обновлялся? Что плохого в том, чтобы позволить SQLite использовать свой файл журнала, как он хочет? Какую проблему ты пытаешься решить? - person Tom Harrington; 05.02.2016
comment
@TomHarrington просто для тестирования, например, процесса миграции. У меня такая же проблема. Мне нужно предварительно заполнить мой магазин. - person sumofighter666; 22.07.2016

Просто на время, когда вы хотите создать файл sqlite, используйте следующие параметры при добавлении постоянного хранилища:

@{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}}

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
                                                            URL:self.localStoreURL
                                                        options:@{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}}
                                                          error:nil];

Затем запустите приложение, выйдите, перейдите в папку приложения и в Documents ваш файл будет обновлен. Я надеюсь, что это поможет вам.

person sumofighter666    schedule 22.07.2016