2016-11-02 8 views
0

나는 사용자가 iOS 장치에서 이메일을 통해 sqlite 데이터베이스를 백업 및 복원하도록합니다. 나는 수출하고 sqlite 데이타베이스를 성공적으로 수입한다. 내 문제는 현재 sqlite 파일을 데이터가 자동으로 업데이트되지 않는 새 파일로 대체하려고 할 때입니다. 함수의 끝에 exit (0)을 추가하면 앱이 닫히고 데이터가 닫힙니다. 이는 기본적으로 충돌이므로 해결 방법이 아닙니다. 여기에 하나의 sqlite 파일을 다른 것으로 대체하는 데 사용하는 함수가 있습니다. 참고 전체 데이터베이스가 하나의 sqlite 파일이되도록 저널링을 해제했습니다. 응용 프로그램이 실행되는 동안 다른 사람과 sqlite 파일을 바꿀 올바른 방법을 아는 사람이 있습니까? 고맙습니다.응용 프로그램이 실행되는 동안 핵심 데이터 sqlite 파일을 전환 하시겠습니까? 데이터가 표시되지 않습니다

- (BOOL)resetApplicationModel { 

// ---------------------- 
// This method removes all traces of the Core Data store and then resets the application defaults 
// ---------------------- 

NSError *_error = nil; 
NSURL *_storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"]; 

NSPersistentStore *_store = [persistentStoreCoordinator persistentStoreForURL:_storeURL]; 

// Remove the SQL store and the file associated with it 
if ([persistentStoreCoordinator removePersistentStore:_store error:&_error]){ 
    [[NSFileManager defaultManager] removeItemAtPath:_storeURL.path error:&_error]; 
} 

if (_error) { 
    NSLog(@"Failed to remove persistent store: %@", [_error localizedDescription]); 
    return NO; 
} 

[persistentStoreCoordinator release], persistentStoreCoordinator = nil; 
[managedObjectContext release], managedObjectContext = nil; 

NSString *applicationDocumentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *originalFile = [applicationDocumentDirectory stringByAppendingPathComponent:@"Database.sqlite"]; 

NSString *backupDatabaseFolder = [applicationDocumentDirectory stringByAppendingPathComponent:@"Backups"]; 
NSString *backupFile = [backupDatabaseFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"DatabaseBackup.sqlite"]]; 

[[NSFileManager defaultManager] copyItemAtPath:backupFile toPath:originalFile error:nil]; 

// Rebuild the application's managed object context 
rootViewController.managedObjectContext = nil; 
rootViewController.managedObjectContext = self.managedObjectContext; 

return YES; 

}

+0

이렇게하면 앱이 새 데이터를 어딘가에로드합니까? –

+0

함수의 끝에 exit (0)를 추가하면 시뮬레이터에서 테스트 할 때 새 데이터가 나타납니다. 앱을 처음 시도 할 때 앱에 메모리가 없으면 앱도 작동합니다. 앱이 메모리에있는 경우 작동하지 않습니다. 메모리에서 앱을 제거한 후 다시 열어도 새 데이터가 표시되지 않습니다. 감사. – d264789

+0

질문에 답변하지 않았습니다. 이 코드를 실행하면 앱이 새 영구 저장소에서 데이터를로드하려고합니까? –

답변

0

나는 당신의 managedObjectContextpersistentStoreCoordinator 방법은 당신이 다시 요구, 전무로 설정 한 후 유유히을 다시 초기화됩니다 즉 approach-- 전형적인를 수행한다고 가정하겠습니다. 그게 아니라면, 그것은 첫 번째 문제입니다, 당신은 오래된 코어 데이터 스택을 찢어 버리고 있지만 그것을 대체하지는 않습니다.

사실이라고 가정하면 문제는 - 앱에서 새로운 데이터를 가져 오려고 시도하지 않는다는 의견에서 말한 것입니다. 앱에 새 데이터를 표시하려는 경우 앱에서 가져 오기 요청을 사용하여 해당 데이터를 요청해야합니다. 위의 메서드를 실행했기 때문에 UI가 자동으로 업데이트되지 않으므로 새 값을 가져 오려면 무언가를 수행해야합니다. 그를하는

당신이 코어 Data-- 모든 관리 객체 플러스 당신이 가질 수있는 가져온 결과 컨트롤러에서 당신이 가져온했습니다 모든 객체를 취소해야한다는 것을 의미합니다.

+0

피드백에 감사드립니다. 아마도 exit 나 app을 사용하면 활성 상태가 아닌데 아직 아무 것도 설정되지 않았기 때문입니다. 이해, 어떻게 모든 개체, 모든 관리 개체 및 가져온 결과 컨트롤러를 지우겠습니까? 그 일을 쉽게 할 수있는 방법이 있습니까? 감사. – d264789

+0

가져온 내용에 대한 참조가있는 변수, 속성 등은 nil로 설정됩니다. 그것이 쉬운 지 여부는 앱 설정 방법에 달려 있습니다. –

+0

사실, 당신 말이 맞습니다. 루트 뷰 컨트롤러는 저장소가 제거 될 때 여전히 개체를 보유하고있는 가져온 결과 컨트롤러를 관리합니다. 저장소를 비운 후에 컨트롤러를 삭제하고 다시로드하려면 어떻게해야합니까? 나는 이것의 변종을 시도했지만 여전히 충돌을 계속 : rootViewController.managedObjectContext = nil; rootViewController.fetchedResultsController = nil; – d264789