2011-03-01 5 views
0

CoreData와 다시 싸우고 있는데 도움이 필요합니다. PCoreData UITableView에 데이터 다시로드 문제

RSS 리더를 쓰고 있습니다. 디자인은 libxml2 라이브러리를 사용하는 Apple TopSongs 예제를 기반으로합니다.

내 응용 프로그램이 끝나면 마지막 업데이트시기를 확인하려고합니다. 1 시간 이상 지난 경우 현재 영구 저장소를 제거하고 모든 것을 다시 다운로드합니다.

if ([[NSFileManager defaultManager] fileExistsAtPath:self.persistentStorePath]) { 
     NSError *error = nil; 
     BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:self.persistentStorePath error:&error]; 
     NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]); 
    } 

로컬 SQL 파일이 삭제 된 것을 볼 수 있습니다.

이제 백그라운드에서 피드의 정보를 다운로드하기 위해 NSOperations를 만들고 있습니다.

지금까지 모든 것이 훌륭하게 작동합니다.

모든 RSS 피드와 마찬가지로, 변경 사항을 확인하고 coreData를 업데이트한다고 가정하는 업데이트 버튼이 있습니다. 초보자를 위해 나는 모든 것을 삭제하고 모든 것을 다시 다운로드하겠다고 결정했다. (내가 알지 못했지만 RSS 피드에는 guid가 없으며 변경 사항이 있는지를 파악하기 위해 해쉬 함수를 구현해야한다.)

그래서 나는 기본적으로 저장소를 삭제하기 위해 위와 같은 코드를 호출하고 있어요 .. 다시 (응용 프로그램을 처음로드 된 같은 논리)

나는를 다시로드하고 모든 RSS 피드 다시 다운로드 테이블을 볼 수 있지만 여전히 tableView에서 동일한 데이터를 볼 수 있습니다. 모든 것이 그대로 유지됩니다.

나는 더 멀리 가고 콘텐츠를 다운로드하지 않고 저장소를 삭제하기로 결정했습니다.

if ([[NSFileManager defaultManager] fileExistsAtPath:app.persistentStorePath]) { 
    NSError *error = nil; 
    BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:app.persistentStorePath error:&error]; 
    NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]); 
} 

    [self.managedObjectContext save:&err]; 
    [self.fetchedResultsController performFetch:&error]; 
    [self.tableView reloadData] 

빈 테이블이 표시 될 것으로 예상되지만 데이터는 여전히 존재합니다.

어떻게 가능합니까? 내가 가게를 지우고, 다시 가져 왔고, 데이터를 다시 불러 들였다.

내가 뭘 잘못하고 있니?

답변

1

안녕하세요, 전체 코어 데이터베이스를 삭제하지 마세요 ... 전체 데이터 자체가 아닌 코어 데이터베이스의 모든 항목을 삭제하십시오. 다음과 같은 방법으로 코어 데이터 데이터베이스에서 개체를 삭제할 수 있습니다

[context deleteObject:aCoreDataObject]; 

아, 한 가지 더 ... 당신이있는 tableview에 반영되지 않습니다 귀하의 코어 데이터 데이터베이스를 변경하는 경우. 당신은 당신이 [tableView reloadData];

+0

당신을 위해 reloadData 일을 했습니까? – Ladislav

+1

은 완벽한 대답을 가지고 있습니다. 빈번하게 지속되는 단위를 삭제하면 실제로 나쁜 습관이됩니다.기존 지속 유닛에서 데이터를 제거하고 최신 지속 유닛을 추가하기 만하면됩니다. –

+0

나는 애플 예제에서 배울 것이고 그들은 " // 모든 객체를 삭제하는 것보다 더 쉽다; // TopSongs 예제에서 기존 저장소를 테스트한다."라고 썼다. – djTeller

1

내가 당신의 문제는 줄 수 있다고 생각 예를 들어 호출 할 필요가 변경 사항을 확인하려면

[self.managedObjectContext 할인 혜택 : & ERR을]

오히려 라디의 제안 @ 따르

NSFetchRequest * allObjectsRequest = [[NSFetchRequest alloc] init]; 
    [allObjectsRequest setEntity:[NSEntityDescription entityForName:@"Object" inManagedObjectContext:context]]; 
    [allObjectsRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID 

    NSError * error = nil; 
    NSArray * objects = [context executeFetchRequest:allObjectsRequest error:&error]; 
    [allObjectsRequest release]; 
    //error handling goes here 
    for (NSManagedObject * object in objects) { 
     [context deleteObject:object]; 
    } 
    [context save:&error];