2016-02-04 69 views
0

我更改了現有的核心堆棧,並且在創建後我的sqlite文件不再更新。我可以使用核心數據保存和獲取數據,但sqlite文件始終爲空(sqlite-shm文件將被更新)。我的執行錯誤?我需要做什麼才能讓我的sqlite文件得到更新?更改核心數據堆棧後,使用核心數據創建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]; 
    }]; 
} 

回答

0

什麼我需要做的,例如讓這個工作?

但你也說

我能夠保存和核心數據獲取數據...

這就是「工作」與核心數據的定義。如果這樣做,你就完成了。

SQLite shm文件是SQLite日誌。這是SQLite如何工作的實現細節。如果你有興趣,你可以在how SQLite manages its files上閱讀,但這與你正在做的事情無關。

+0

也許我應該改變我的問題:「我需要做些什麼才能使這個工作?」到「我需要做些什麼才能讓我的sqlite文件更新?」要更清楚? – iamarnold

+0

爲什麼你想要它被更新?讓SQLite使用它的日誌文件有什麼問題,就像它想要的那樣?你想解決什麼問題? –

+0

@TomHarrington僅用於測試遷移過程的示例。我有同樣的問題。我需要預先填充我的商店。 – sumofighter666

0

只要你想生成sqlite的文件使用下面的選項,當您添加持久性存儲時間:

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

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

然後運行該應用程序,退出,進入到應用程序文件夾中, Documents你的文件將被更新。我希望這能幫到您。