Tôi đã tìm kiếm trong SO nhưng tôi không tìm thấy bất kỳ đề xuất nào để tăng hiệu suất khi xóa đối tượng được quản lý trong dữ liệu lõi khi xử lý mối quan hệ.Cân nhắc hiệu suất khi xóa đối tượng được quản lý bằng cách sử dụng quy tắc Cascade trong dữ liệu lõi
Kịch bản khá đơn giản.
Như bạn có thể thấy có ba thực thể khác nhau. Mỗi thực thể được liên kết trong tầng với tiếp theo. Ví dụ: FirstLevel
có mối quan hệ được gọi là secondLevels
đến SecondLevel
. Quy tắc xóa từ FirstLevel
đến SecondLevel
là Cascade trong khi quy tắc xóa từ SecondLevel
đến FirstLevel
là Nullify. Các quy tắc tương tự được áp dụng giữa SecondLevel
và ThirdLevel
.
Khi tôi muốn xóa toàn bộ đồ thị, tôi thực hiện một phương pháp như sau:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FirstLevel" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
// delete roots object and let Core Data to do the rest...
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
}
Lợi dụng các Cascade cai trị đồ thị được lấy ra. Điều này làm việc nhanh cho vài đối tượng nhưng giảm hiệu suất cho nhiều đối tượng. Ngoài ra, tôi nghĩ (nhưng tôi không chắc chắn) rằng loại xóa này thực hiện rất nhiều chuyến đi vòng vào đĩa, Tôi có sai không? Vì vậy, câu hỏi của tôi là như sau: làm thế nào là nó có thể loại bỏ các đồ thị mà không tận dụng lợi thế của quy tắc Cascade và tăng hiệu suất, nhưng, cùng một lúc, duy trì tính nhất quán của đồ thị?
Cảm ơn bạn trước.
EDIT
tôi không thể xóa toàn bộ tập tin kể từ khi tôi có các đơn vị khác trong mô hình của tôi.
EDIT 2
Code tôi gửi được gói trong các phương pháp main
của một lớp con NSOperation
. Giải pháp này cho phép các giai đoạn xóa được excuted trong nền. Vì tôi đã tận dụng lợi thế của Quy tắc Cascade việc xóa được thực hiện theo cách bán tự động. Tôi chỉ xóa các đối tượng gốc, các mục FirstLevel
, bằng vòng lặp for trong mã được đăng. Theo cách này, Core Data sẽ làm phần còn lại cho tôi. Những gì tôi tự hỏi là sau đây: là nó có thể bybass rằng hoạt động xóa bán tự động và làm điều đó bằng tay mà không làm mất tính nhất quán của đồ thị?
Bạn có muốn xóa toàn bộ biểu đồ, ý tôi là, xóa tất cả các cửa hàng liên tục hay chỉ một số chi nhánh? –
Toàn bộ biểu đồ. –
Sau đó, điều này sẽ giúp bạn? Http: //stackoverflow.com/questions/3266084/how-to-remove-all-objects-from-core-data –