0

코어 데이터 저장소 (sqlite)를 삭제하는 방법이 올바른지 확인하고 싶습니다. 충돌없이 작동하는 것으로 보이지만 이것이 올바른 방법인지 확인하고 싶었습니다. 이후 사용자가 데이터베이스에 연결하면 새 sqlite 파일이 자동으로 생성됩니다.코어 데이터 저장소를 삭제하고 다시 만드는 올바른 방법

- (BOOL)dropDataStore{ 
// ---------------------- 
// This method removes all traces of the Core Data store 
// ---------------------- 

NSError *_error = nil; 
NSURL *_storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Store.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) { 
return NO; 
} 

persistentStoreCoordinator = nil; 
managedObjectContext = nil; 
managedObjectModel = nil; 

return YES; 
} 

답변

0

이것은 좋은 방법이 아닙니다 :

다음은 데이터 저장소를 삭제하려면 코드입니다.

iOS 7 이상의 SQLite는 주 파일과 동일한 디렉토리에 저널 파일을 만듭니다. 이러한 정보를 남겨두면 오래된 데이터가 새 파일에 지속되거나 데이터가 손상 될 수 있습니다. 따라서 최소Store.sqlite-shmStore.sqlite-wal을 제거해야합니다.

코어 데이터 모델에서 이진 특성을 사용하고 해당 특성에 대해 "외부 저장소 허용"을 사용하도록 설정 한 경우 이러한 특성 값을 외부 파일에 저장할 수 있습니다. 분명히 당신의 코드는 그것들을 제거하지 않을 것이지만,이 파일의 위치는 문서화되어 있지 않습니다.

코어 데이터 영구 저장소 파일을 제거해야 할 것으로 예상되는 경우 실제로 파일을 문서 디렉토리에 직접 배치하는 대신 자신의 사용자 정의 하위 디렉토리에 저장해야합니다. 그런 다음 해당 디렉토리의 모든 항목을 반복적으로 제거 할 수 있으며 코어 데이터가 영구 저장소 파일 외부에 추가 파일을 생성하는지 여부는 신경 쓰지 않아도됩니다.

+0

감사합니다. Tom. 나는 shm과 wal 파일들이 문제가되지 않도록 저널링을 꺼 놓았다. 내 모델의 유일한 속성은 부동 소수점, 날짜 및 정수입니다. 내가이 일을하는 이유는 사용자에게 "모든 데이터 삭제"옵션을 제공하기 위해서입니다.이 방법은 각 엔티티의 객체를 비우지 않고 깨끗하다고 ​​생각했습니다.이 추가 정보를 사용하면 함수 사운드가됩니다. 감사합니다. – d264789

+0

소리가 들립니다. 저널링을 끄는 것이 실제로 좋은 생각이 아니라는 점과, 나중에 저널링이 가능 해지거나 모델에 바이너리 속성을 추가하는 경우에도 유지 보수 문제가 될 수 있다는 점에서 소리가 나지 않습니다. –

+0

감사합니다 Tom 모든 데이터를 하나의 단일 파일로 유지하기 위해 저널링 기능을 끄고, 하나의 파일 만 백업하기 위해 itunes 파일 공유를 사용하여 백업 할 때 사용자에게 유용합니다. 이것은 유효한 해결책은 아니지만, 현재 상황에서이 방법으로 충돌이나 다른 종류의 손상이 발생할 수 있습니까? – d264789