아무도 나를 도울 수 있습니까? 나는 정말로 붙어있다.기존 코어 데이터베이스에서 다시 읽을 수 없습니다.
내 코드에서 문서 위치에 파일이없는 경우; 저장소를 만들고 데이터를 저장 한 다음 다시 읽습니다. 이것은 잘 작동합니다. 그러나 해당 위치에 파일이 이미있는 경우 다시 읽을 수 없습니다. 나는 많은 시도를했지만 실제로 작동하지 않는 이유는 확실치 않습니다. 몇 번 (실제로는 거의 없음), 똑같은 코드가 작동하지만 그렇지 않은 경우도 있습니다.
다음은 코드입니다. 작동하지 않으면 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");
}