[ios] 핵심 데이터의 모든 항목을 삭제 / 재설정 하시겠습니까?

Core Data에 저장된 모든 항목을 삭제하는 방법을 알고 있습니까? 내 스키마는 동일하게 유지되어야합니다. 그냥 공백으로 재설정하고 싶습니다.


편집하다

사용자가 기본적으로 reset버튼을 누를 수 있도록 프로그래밍 방식 으로이 작업을 수행하려고 합니다.



답변

NSFileManager : removeItemAtPath :: 메소드를 사용하여 프로그래밍 방식으로 파일을 삭제할 수 있습니다.

NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

그런 다음 지속적 저장소를 다시 추가하여 올바르게 다시 작성하십시오.

각 엔티티를 반복하는 프로그래밍 방식은 느리고 오류가 발생하기 쉽습니다. 그런 식으로 사용하는 것은 다른 엔티티가 아닌 일부 엔티티를 삭제하려는 경우입니다. 그러나 여전히 참조 무결성을 유지해야합니다. 그렇지 않으면 변경 사항을 유지할 수 없습니다.

상점을 제거하고 다시 작성하면 빠르고 안전하며 런타임에 프로그래밍 방식으로 수행 할 수 있습니다.

iOS5 이상 업데이트

iOS 5 및 OS X 10.7에 외부 바이너리 저장소 (ExternalBinaryDataStorage 또는 외부 레코드 파일에 저장)를 도입하면 storeURL이 가리키는 파일을 삭제하는 것만으로는 충분하지 않습니다. 외부 레코드 파일은 그대로 둡니다. 이러한 외부 레코드 파일의 이름 지정 체계는 공개적이지 않으므로 아직 보편적 인 솔루션이 없습니다. – an0 5 월 8 일 12시 23:00


답변

SQLite 파일을 삭제할 수는 있지만 함수를 사용하여 테이블을 개별적으로 제거하여 선택합니다.

- (void) deleteAllObjects: (NSString *) entityDescription  {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];


    for (NSManagedObject *managedObject in items) {
        [_managedObjectContext deleteObject:managedObject];
        DLog(@"%@ object deleted",entityDescription);
    }
    if (![_managedObjectContext save:&error]) {
        DLog(@"Error deleting %@ - error:%@",entityDescription,error);
    }

}

내가 테이블별로 테이블을 선택하는 이유는 프로그래밍을 수행하면서 테이블의 내용을 삭제하는 것이 합리적이며 오히려 유지할 데이터가 없다는 것을 확인하게하기 때문입니다.

이렇게하면 파일을 삭제하는 것보다 훨씬 느리며이 방법이 너무 오래 걸리면 파일 삭제로 변경됩니다.


답변

iOS 10 이상을위한 업데이트 된 솔루션

사용 NSBatchDeleteRequest그들을 통해 메모리 또는 반복 처리에로드 할 필요없이 기업의 모든 개체를 삭제합니다.

// create the delete request for the specified entity
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = MyEntity.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer

// perform the delete
do {
    try persistentContainer.viewContext.execute(deleteRequest)
} catch let error as NSError {
    print(error)
}

이 코드는 iOS 10 및 Swift 3 용으로 업데이트되었습니다. iOS 9를 지원해야하는 경우이 질문을 참조하십시오 .

출처 :


답변

clearStores모든 저장소를 거치고 코디네이터와 파일 시스템에서 모두 삭제 하는 방법을 작성했습니다 (오류 처리는 제외).

NSArray *stores = [persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}

[persistentStoreCoordinator release], persistentStoreCoordinator = nil;

이 메소드는 coreDataHelper클래스가 없을 때 영속 저장소를 작성하는 것을 처리합니다.


답변

HomeViewController 클래스의 버튼 이벤트에서 핵심 데이터에서 모든 데이터를 제거합니다.이 기사는 내가 기여할 것이라고 생각했습니다.

-(IBAction)buttonReset:(id)sender
{
    NSLog(@"buttonReset Pressed");

    //Erase the persistent store from coordinator and also file manager.
    NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
    NSError *error = nil;
    NSURL *storeURL = store.URL;
    [self.persistentStoreCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];


    NSLog(@"Data Reset");

    //Make new persistent store for future saves   (Taken From Above Answer)
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // do something with the error
    }

}

self.persistentStoreCoordinator를 호출하기 위해 홈 뷰 컨트롤러에서 속성을 선언했습니다. (저장 및로드에 사용하는 managedObjectContext에 대해 걱정하지 마십시오.)

@property (nonatomic, retain) NSManagedObjectContext        *   managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator  *   persistentStoreCoordinator;

그런 다음 AppDelegate ApplicationDidFinishLaunching에서 HomeViewController를 생성하는 바로 아래에 있습니다.

homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;


답변

MagicalRecord 는 이것을 매우 쉽게 만듭니다.

[MyCoreDataObject MR_truncateAll];


답변

iOS9 +, 스위프트 2

모든 엔티티에서 모든 객체 삭제

func clearCoreDataStore() {
    let entities = managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.executeRequest(deleteReqest)
        } catch {
            print(error)
        }
    }
}