2012-05-07 34 views
10

Tôi có một thực thể trong mô hình dữ liệu cốt lõi của tôi như thế này:Xóa một đối tượng trong dữ liệu cốt lõi

@interface Selection : NSManagedObject 

@property (nonatomic, retain) NSString * book_id; 
@property (nonatomic, retain) NSString * contenu; 
@property (nonatomic, retain) NSNumber * page_id; 
@property (nonatomic, retain) NSNumber * nbrOfOccurences; 
@property (nonatomic, retain) NSString * next; 
@property (nonatomic, retain) NSString * previous; 

Tôi đã tạo ra nhiều Selection s và lưu chúng trong Core Data và bây giờ tôi muốn xóa một số lựa chọn với một số tiêu chí. Ví dụ: tôi muốn xóa đối tượng Selection nếu phù hợp với các đối tượng sau:

content = test 
page_id = 5 
book_id = 1331313 

Làm cách nào để thực hiện việc này?

Trả lời

34

Điều gì Mike Weller đã viết là đúng. Tôi sẽ mở rộng câu trả lời một chút.

Trước tiên, bạn cần phải tạo ra một NSFetchRequest như sau:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];  
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Selection" inManagedObjectContext:context]]; 

Sau đó, bạn phải thiết lập vị cho rằng yêu cầu như sau:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"content == %@ AND page_id == %@ AND book_id == %@", contentVal, pageVal, bookVal]]; 

nơi

NSString* contentVal = @"test"; 
NSNumber* pageVal = [NSNumber numberWithInt:5]; 
NSString* bookVal = @"1331313"; 

Tôi đang sử dụng %@ vì tôi giả sử bạn đang sử dụng o bjects và không phải là các giá trị vô hướng.

Bây giờ bạn thực hiện một lấy trong bối cảnh với các yêu cầu trước đó:

NSError* error = nil; 
NSArray* results = [context executeFetchRequest:fetchRequest error:&error]; 

results chứa tất cả các đối tượng được quản lý phù hợp với vị ngữ.

Cuối cùng, bạn có thể lấy các đối tượng và gọi xóa chúng.

[context deleteObject:currentObj]; 

Sau khi hoàn tất, bạn cần lưu ngữ cảnh theo tài liệu.

Cũng như một đối tượng mới không được lưu vào cửa hàng cho đến khi bối cảnh được lưu, một đối tượng đã xóa sẽ không bị xóa khỏi cửa hàng cho đến khi ngữ cảnh được lưu.

Do đó

NSError* error = nil; 
[context save:&error]; 

Lưu ý rằng save phương thức trả về một giá trị bool. Vì vậy, bạn có thể sử dụng một cách tiếp cận như sau hoặc hiển thị một cảnh báo cho người dùng. Nguồn NSManagedObjectContext save error.

NSError *error = nil; 
if ([context save:&error] == NO) { 
    NSAssert(NO, @"Save should not fail\n%@", [error localizedDescription]); 
    abort(); 
} 
+1

Cảm ơn câu trả lời của bạn – samir

+1

@flexaddicted Điều này cần được chỉnh sửa để bao gồm lệnh '[context save: & error]' cần thực hiện, nếu không đối tượng đã xóa sẽ không bị xóa khỏi cửa hàng . Ngoài ra, nếu bạn đang sử dụng một cửa hàng liên tục, nó phải được lưu như sau: '[context saveToPersistentStore: & error]'. –

+0

@EvanR Đã sửa đổi câu trả lời của tôi có tính đến nhận xét của bạn. –

5

Bạn nên thực hiện yêu cầu tìm nạp bằng cách sử dụng NSPredicate với điều kiện thích hợp và sau đó gọi phương thức deleteObject: trên NSManagedObjectContext với từng đối tượng trong tập hợp kết quả.

+0

cảm ơn câu trả lời của bạn – samir

4

Ngoài Mike Weller và flexaddicted, sau khi gọi [context deleteObject:currentObj]; bạn cần phải save: bối cảnh:

NSError *error = nil; 
[context save:&error]; 

Kể từ documentation:

Cũng như một đối tượng mới không được lưu vào cửa hàng cho đến khi bối cảnh được lưu, một đối tượng đã xóa sẽ không bị xóa khỏi cửa hàng cho đến khi bối cảnh được lưu.

Điều đó xảy ra trong trường hợp của tôi.

+0

Điều này chắc chắn là cần thiết — Tôi đã đề xuất nó như một bản chỉnh sửa cho câu trả lời được chấp nhận. –

Các vấn đề liên quan