2012-04-19 6 views
1

아무도 나를 도울 수 있습니까? 나는 정말로 붙어있다.기존 코어 데이터베이스에서 다시 읽을 수 없습니다.

내 코드에서 문서 위치에 파일이없는 경우; 저장소를 만들고 데이터를 저장 한 다음 다시 읽습니다. 이것은 잘 작동합니다. 그러나 해당 위치에 파일이 이미있는 경우 다시 읽을 수 없습니다. 나는 많은 시도를했지만 실제로 작동하지 않는 이유는 확실치 않습니다. 몇 번 (실제로는 거의 없음), 똑같은 코드가 작동하지만 그렇지 않은 경우도 있습니다.

다음은 코드입니다. 작동하지 않으면 useDocument 메소드의 'end of useDocument'디버그 메시지가 기록되지 않습니다. 이것은 openWithCompletionHandler가 UIManagedDocument에서 호출되는 메소드입니다. 코드는 메소드에 들어가지만 그 메소드의 끝으로 가지 않습니다!

- (void)setupFetchedResultsController 
{ NSLog(@"In setupFetchedResultsController"); 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"WorkOutTypes"]; 
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"workoutName" ascending:YES]]; 


self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                    managedObjectContext:self.workoutDatabase.managedObjectContext 
                     sectionNameKeyPath:nil 
                       cacheName:nil]; 

NSLog(@"End of setupFetchedResultsController"); 
} 

- (void)pushWorkoutDataIntoDocument:(UIManagedDocument *)document 
{ NSLog(@"In pushWorkoutDataIntoDocument"); 
dispatch_queue_t pushQ = dispatch_queue_create("Push data", NULL); 
dispatch_async(pushQ, ^{ 
    NSArray *workOuts = [NSArray arrayWithObjects:@"Squats", @"Bench Press", @"Overhead Press", @"Bent Over Rows", nil]; 
    [document.managedObjectContext performBlock:^{ 
     for (NSString *workout in workOuts) { 
      [WorkOutTypes workoutName:workout inManagedObjectContext:document.managedObjectContext]; 
     } 
    }];   
}); 
dispatch_release(pushQ); 
} 

- (void)useDocument 
{ NSLog(@"In useDocument"); 
NSLog(@"File path - %@", [self.workoutDatabase.fileURL path]); 
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.workoutDatabase.fileURL path]]) { 
    NSLog(@"1"); 
    [self.workoutDatabase saveToURL:self.workoutDatabase.fileURL 
       forSaveOperation:UIDocumentSaveForCreating 
       completionHandler:^(BOOL success){ 
        [self setupFetchedResultsController]; 
        [self pushWorkoutDataIntoDocument:self.workoutDatabase]; 
       }]; 
} 
else 
    if (self.workoutDatabase.documentState == UIDocumentStateClosed) { 
     NSLog(@"2"); 
     [self.workoutDatabase openWithCompletionHandler:^(BOOL success){ 
      NSLog(@"handler called");[self setupFetchedResultsController];}]; 
    } 
    else 
     if (self.workoutDatabase.documentState == UIDocumentStateNormal) { 
      NSLog(@"3"); 
      [self setupFetchedResultsController]; 
     } 
NSLog(@"End of useDocument"); 

} 

- (void)setWorkoutDatabase:(UIManagedDocument *)workoutDatabase 
{ NSLog(@"In setWorkoutDatabase"); 
if (_workoutDatabase != workoutDatabase) { 
    _workoutDatabase = workoutDatabase; 
    [self useDocument]; 
} 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
// self.navigationItem.rightBarButtonItem = self.editButtonItem; 

if (!self.workoutDatabase) { 
    NSLog(@"Came in"); 
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"Default Workouts Database"]; 
    self.workoutDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; 
    NSLog(@"URL - %@", [url path]); 
} 
if (self.workoutDatabase) { 
    NSLog(@"workoutDatabase created"); 
} 
else 
    NSLog(@"workoutDatabase not created"); 
} 

답변

0

지금 질문을 마감하십시오. UIManagedDocument 대신 전통적인 Core Data 스택을 사용하는 것으로 바뀌 었습니다. 그것은 아주 신뢰할 수 없었다.

관련 문제