2010-07-16 34 views
6

làm cách nào tôi có thể xóa tất cả các đối tượng? Tôi biết tôi có thể xóa một bằng cáchcách xóa tất cả các đối tượng khỏi Dữ liệu chính

[managedObjectContext deleteObject:objToDelete]; 

có thể xóa tất cả mà không cần lặp lại tất cả mảng không? cảm ơn

+1

thể trùng lặp của (http [Xóa/Cài lại tất cả các mục trong Core Data?]: // stackoverflow. com/questions/1077810/delete-reset-all-entries-in-core-data) –

Trả lời

8

Đánh dấu các đối tượng để xóa và sau đó lưu hoạt động theo cách của nó vì dữ liệu cốt lõi vẫn cần chạy các quy tắc xác thực cho tất cả các đối tượng bị xóa. Sau khi tất cả, một đối tượng có thể từ chối xóa dựa trên cách nó phản ứng với -validateForDelete:.

Nếu:

  • bạn thực sự muốn xóa tất cả mọi thứ trong một cửa hàng khăng khăng
  • bạn không chăm sóc về việc liệu các đối tượng trong đó cửa hàng khăng khăng nói rằng họ đang hợp lệ để xóa

Sau đó:

  • xé ngăn xếp Dữ liệu cốt lõi đang sử dụng cửa hàng liên tục đó
  • và xóa tệp của cửa hàng liên tục.
2

Chỉ cần lặp lại mảng và xóa chúng. Không có phương pháp nào được xác định để xóa tất cả.

+0

Ok, cảm ơn bạn, hy vọng họ sẽ cung cấp cho chúng tôi cách tốt hơn để làm điều đó trong tương lai :) – Burjua

6

Bạn cũng có thể chỉ cần xé ngăn xếp (phát hành NSManagedObjectContext, NSPersistentStoreNSManagedObjectModel) và xóa tệp. Có lẽ sẽ nhanh hơn việc lặp qua toàn bộ cơ sở dữ liệu của bạn và xóa từng đối tượng riêng lẻ.

Ngoài ra, có khả năng chúng sẽ không cung cấp chức năng này trong tương lai vì dễ dàng xóa tệp. Tuy nhiên, nếu bạn cảm thấy nó quan trọng thì hãy đặt một radar và cho Apple biết. Nếu không, họ sẽ không biết có bao nhiêu người muốn tính năng này.

8

đây là những gì tôi làm để "thiết lập lại" lưu trữ dữ liệu của tôi:

- (BOOL)resetDatastore 
{ 
    [[self managedObjectContext] lock]; 
    [[self managedObjectContext] reset]; 
    NSPersistentStore *store = [[[self persistentStoreCoordinator] persistentStores] lastObject]; 
    BOOL resetOk = NO; 

    if (store) 
    { 
     NSURL *storeUrl = store.URL; 
     NSError *error; 

     if ([[self persistentStoreCoordinator] removePersistentStore:store error:&error]) 
     { 
      [[self persistentStoreCoordinator] release]; 
      __persistentStoreCoordinator = nil; 
      [[self managedObjectContext] release]; 
      __managedObjectContext = nil; 

      if (![[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:&error]) 
      { 
       NSLog(@"\nresetDatastore. Error removing file of persistent store: %@", 
        [error localizedDescription]); 
       resetOk = NO; 
      } 
      else 
      { 
       //now recreate persistent store 
       [self persistentStoreCoordinator]; 
       [[self managedObjectContext] unlock]; 
       resetOk = YES; 
      } 
     } 
     else 
     { 
      NSLog(@"\nresetDatastore. Error removing persistent store: %@", 
       [error localizedDescription]); 
      resetOk = NO; 
     } 
     return resetOk; 
    } 
    else 
    { 
     NSLog(@"\nresetDatastore. Could not find the persistent store"); 
     return resetOk; 
    } 
} 
+0

Mã của bạn đang làm việc tuyệt vời cảm ơn bạn rất nhiều ...... –

+0

+1 cho hầu như không có ký hiệu chấm. Làm tốt lắm. Ngoài ra, hãy xóa các cuộc gọi phát hành nếu bạn cần triển khai ARC. – ColdLogic

+0

Cảm ơn. Tôi đã đăng một phiên bản sửa đổi sử dụng '' '-performBlockAndWait:' '' –

11

Chức năng này loại bỏ các tập tin SQLite db hiện tại từ đĩa và tạo ra một cái mới. Đó là nhanh hơn nhiều so với bất kỳ xóa lặp đi lặp lại.

-(void)deleteAndRecreateStore{ 
     NSPersistentStore * store = [[self.persistentStoreCoordinator persistentStores] lastObject]; 
     NSError * error;  
     [self.persistentStoreCoordinator removePersistentStore:store error:&error]; 
     [[NSFileManager defaultManager] removeItemAtURL:[store URL] error:&error]; 
     __managedObjectContext = nil; 
     __persistentStoreCoordinator = nil; 
     [self managedObjectContext];//Rebuild The CoreData Stack 
} 

Nếu bạn muốn gọi Đại biểu ứng dụng bên ngoài này (giả soạn sẵn CoreData hội nhập), bạn có thể sử dụng this để có được một tài liệu tham khảo để ứng dụng đại biểu của bạn:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Đừng quên để nhập tiêu đề .

+0

Đoạn mã nhỏ cuối cùng – ramirogm

+0

Nhanh chóng và đơn giản - Tôi thích nó, cảm ơn bạn đã chia sẻ ;-) –

1

Khi bạn xóa tất cả bộ nhớ cache và tài liệu, bạn sẽ xóa cơ sở dữ liệu.Không phải là cuộc gọi necesary để managedObjectContext

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSMutableArray *paths = [NSMutableArray array]; 
[paths addObjectsFromArray:documents]; 
[paths addObjectsFromArray:caches]; 
for (NSUInteger i = 0; i < [paths count]; i++) { 
    NSString *folderPath = [paths objectAtIndex:i]; 
    NSLog(@"Attempting to remove contents for: %@", folderPath); 
    //Remove all cached data in the local app directory 
    NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error]; 
    for (NSString *strName in dirContents) { 
     [[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:strName] error:&error]; 
     if (error != nil) { 
      NSLog(@"Error removing item: %@ : %@", strName, error.description); 
     } else { 
      NSLog(@"Removed item: %@", strName); 
     } 
    } 
} 
0

tôi đã sử dụng mã stifin và cập nhật nó để sử dụng -performBlockAndWait:

- (BOOL)reset 
{ 
    __block BOOL result = YES; 

    [[self mainContext] performBlockAndWait:^{ 
     [[self mainContext] reset]; 

     NSArray* stores = [[self persistentStoreCoordinator] persistentStores]; 

     _mainContext = nil; 
     _persistedContext = nil; 

     for(NSPersistentStore* store in stores) { 
      NSError* error; 

      if(![[self persistentStoreCoordinator] removePersistentStore:store error:&error]) { 
       debuglog(@"Error removing persistent store: %@", [error localizedDescription]); 
       result = NO; 
      } 
      else { 
       if(![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) { 
        debuglog(@"Error removing file of persistent store: %@", [error localizedDescription]); 
        result = NO; 
       } 
      } 
     } 

     _persistentStoreCoordinator = nil; 
    }]; 

    return result; 
} 
Các vấn đề liên quan