2014-07-20 1 views
1

제 아이오스 앱에서는 Magical Record와 NSFetchedResultsController를 사용하고 있습니다. 나는 기능 아래에 구현하기 위해 노력하고 있습니다 :Magical Record - DB 파일이 삭제 된 경우에도 중복 레코드가 나타납니다.

  1. 사용자가 설정 화면을 탐색
  2. 그는 선택 - 그는 화면
  3. 등록 다시 탐색한다
  4. 그의 모든 데이터가 삭제되고 '계정 삭제'

    - (void)cleanAndResetupDB 
    { 
        [MagicalRecord cleanUp]; 
    
        BOOL isSuccess = YES; 
        for (NSString *dbStore in [self dbBackups]) { 
         NSError *error = nil; 
    
         NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore]; 
    
         if(![[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]){ 
          NSLog(@"An error has occurred while deleting %@", dbStore); 
          NSLog(@"Error description: %@", error.description); 
          isSuccess = NO; 
         } 
        } 
    
        if (isSuccess) { 
         [MagicalRecord setupCoreDataStackWithStoreNamed:CRP_DB]; 
        } 
    } 
    
    - (NSArray *)dbBackups 
    { 
        NSString *shmFileName = [NSString stringWithFormat:@"%@-shm",CRP_DB]; 
        NSString *walFileName = [NSString stringWithFormat:@"%@-wal",CRP_DB]; 
        return @[CRP_DB,shmFileName,walFileName]; 
    } 
    
    :

내가 코드를 아래에 쓴 그의 모든 데이터를 삭제하려면

등록이 완료되면 사용자는 서버에서 관련 연락처를 검색하여 로컬 DB에 저장하는 연락처 화면으로 이동합니다. FRC는 로컬 DB에서 데이터를 검색하여 테이블 뷰로 표시하므로 데이터가 db에 저장 되 자마자 테이블 뷰에 자동으로 나타납니다.

문제 : 로컬 데이터베이스를 제거한 후 앱을 종료하면 다시 실행하면 적절한 레코드가 표시되지만 로컬 데이터베이스를 제거한 후에 앱을 종료하지 않으면 중복 레코드가 표시됩니다.

실마리가 있습니까?

+1

여기를 참조하십시오. http://stackoverflow.com/questions/1077810/delete-reset-all-entries-in-core-data – johndpope

답변

2

핵심 데이터를 사용하고 데이터베이스를 제거하려는 경우 실제로 영구 저장소를 제거해야합니다. 단순히 데이터베이스 파일을 삭제하는 것만으로는 충분하지 않습니다. 핵심 데이터는 개체를 메모리에 캐시하고 개체를 삭제해야하는지 여부를 모르는 경우 데이터베이스에 다시 커밋 될 수 있습니다. 특히 removePersistentStore:error:에 대한 전화가 누락되었습니다.

NSPersistentStoreCoordinator *storeCoordinator = ...; // you should already have a persistent store coordinator 
NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore]; 
[storeCoordinator removePersistentStore:store error:&error]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];