2012-05-07 90 views
10

我在我的核心數據模型是這樣一個實體:刪除核心數據對象

@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; 

我創造了許多Selection S和在覈心數據保存了他們,現在我想刪除一些選擇與一些標準。例如,我想刪除Selection對象,如果下面的比賽:

content = test 
page_id = 5 
book_id = 1331313 

我怎麼能做到這一點?

回答

34

什麼邁克韋勒寫道是正確的。我會稍微擴大答案。

首先,你需要創建一個NSFetchRequest類似如下:

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

然後你必須設置謂詞像下面這個請求:

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

其中

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

我使用%@因爲我假設你正在使用o而不是標量值。

現在執行與前一個請求上下文中的獲取:

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

results包含所有匹配的謂詞的管理對象。

最後你可以抓住對象並調用它們的刪除。

[context deleteObject:currentObj]; 

完成後,您需要根據文檔保存上下文。

就像在保存上下文之前沒有將新對象保存到商店一樣,刪除的對象不會從商店中刪除,直到上下文被保存。

因此

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

注意save方法返回一個布爾值。因此,您可以使用類似於以下的方法或向用戶顯示警報。來源NSManagedObjectContext save error

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

感謝您的回答 – samir

+1

@flexaddicted這應該被編輯爲包含需要發生的'[context save:&error]'調用,否則刪除的對象不會從商店中刪除。另外,如果您使用的是持久性存儲,則必須像這樣保存:'[context saveToPersistentStore:&error]'。 –

+0

@EvanR修改我的答案考慮到你的評論。 –

5

您應該使用具有適當條件的NSPredicate執行提取請求,然後使用結果集中的每個對象調用NSManagedObjectContext上的deleteObject:方法。

+0

感謝您的回答 – samir

4

除了邁克·韋勒和flexaddicted,調用[context deleteObject:currentObj];後,你需要​​方面:

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

由於從documentation

就像一個新的對象不保存到直到上下文被保存時,商店纔會刪除對象,直到上下文被保存。

這件事情在我的情況。

+0

這絕對是必要的 - 我建議將它作爲接受答案的編輯。 –