SQLite файлът не се актуализира, след като е създаден с Core Data след промяна на Core Data Stack

Промених съществуващия си основен стек и 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
Може би трябва да променя въпроса си от Какво трябва да направя, за да заработи това? до Какво трябва да направя, за да накарам моя 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