[Trả lời muộn để trả lời tiền thưởng yêu cầu trả lời mới hơn]
Nhìn qua các câu trả lời trước đó,
- Tìm nạp và xóa tất cả các mục, theo đề xuất của @Grouchal và các mục khác, vẫn là một giải pháp hiệu quả và hữu ích. Nếu bạn có kho dữ liệu rất lớn thì có thể chậm, nhưng nó vẫn hoạt động rất tốt.
- Đơn giản chỉ cần xóa kho lưu trữ dữ liệu là, như bạn và @groundoose lưu ý, không còn hiệu quả. Nó đã lỗi thời ngay cả khi bạn không sử dụng bộ nhớ nhị phân bên ngoài vì iOS 7 sử dụng chế độ WAL để ghi nhật ký SQLite. Với chế độ WAL, có thể có các tệp nhật ký (có khả năng lớn) nằm xung quanh cho bất kỳ cửa hàng lưu trữ liên tục Core Data nào.
Nhưng có một cách tiếp cận khác, tương tự để loại bỏ các cửa hàng liên tục hoạt động. Điều quan trọng là đặt tệp lưu trữ liên tục của bạn vào thư mục con riêng không chứa bất kỳ thứ gì khác. Đừng chỉ dán nó vào thư mục tài liệu (hoặc bất cứ nơi nào), hãy tạo một thư mục con mới chỉ dành cho cửa hàng liên tục. Nội dung của thư mục đó cuối cùng sẽ là tệp lưu trữ liên tục, tệp nhật ký và tệp nhị phân bên ngoài. Nếu bạn muốn nuke toàn bộ kho dữ liệu, hãy xóa thư mục đó và tất cả chúng sẽ biến mất.
Bạn sẽ làm một cái gì đó như thế này khi thiết lập cửa hàng liên tục của bạn:
NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
withIntermediateDirectories:NO
attributes:nil
error:nil]) {
NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
// continue with storeURL as usual...
}
Sau đó, khi bạn muốn loại bỏ các cửa hàng,
[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];
Điều đó đệ quy loại bỏ cả thư mục con tùy chỉnh và tất cả các tệp Dữ liệu lõi trong đó.
Điều này chỉ hoạt động nếu bạn chưa có cửa hàng liên tục trong cùng thư mục với các dữ liệu quan trọng khác . Giống như thư mục tài liệu, có lẽ có những thứ hữu ích khác trong đó. Nếu đó là tình huống của bạn, bạn có thể có được hiệu ứng tương tự bằng cách tìm kiếm các tệp mà bạn làm muốn giữ lại và loại bỏ tất cả mọi thứ khác. Cái gì đó như:
NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
// Look at docsDirectoryItem. If it's something you want to keep, do nothing.
// If it's something you don't recognize, remove it.
}
Cách tiếp cận này có thể dễ bị lỗi . Bạn phải hoàn toàn chắc chắn rằng bạn biết mọi tệp bạn muốn giữ, vì nếu không, bạn có thể xóa dữ liệu quan trọng. Mặt khác, bạn có thể xóa các tệp nhị phân bên ngoài mà không thực sự biết tên tệp / thư mục được sử dụng để lưu trữ chúng.
NSBatchDeleteRequest
. stackoverflow.com/a/31961330/3681880