I changed my existing core stack and my sqlite file doesn't get updated anymore after it's created. I'm able to save and fetch data with core data, but the sqlite file is always empty(the sqlite-shm file gets updated instead). Is my implementation wrong? What do I need to do to get this to work?
//header file
@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;
//implementation file
@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];
}
//example of trying to save data
-(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];
}];
}
Aucun commentaire:
Enregistrer un commentaire