2014-07-25 32 views
1

是否有方法通過一個SQL查詢運行某個實體的所有對象的更新? 不能獲取和運行循環。批量更新iOS 7中的數據CoreData

例如喜歡跑

UPDATE someEntity SET filed1 = value1 WHERE field2 = value2 

回答

1

Mercelo的回答不會爲iOS7工作,爲此,您可以

NSFetchRequest *fetchAllRSSItems = [NSFetchRequest fetchRequestWithEntityName:[RSSItem entityName]]; 
NSError *fetchError; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchAllRSSItems error:&fetchError]; 

if (results == nil) { 

    NSLog(@"Error: %@", [fetchError localizedDescription]); 
} else { 

    for (RSSItem *rssItem in results) { 
     rssItem.read = [NSNumber numberWithBool:YES]; 
    } 

    [self saveManagedObjectContext]; 
} 
+0

是的,但是這會將所有對象都帶入內存! –

+0

是的,這是真的,但如果你正在尋找向後兼容的答案,你可以使用這個答案。 –

3

核心數據批量更新引入了在iOS 8:

NSBatchUpdateRequest *batchRequest = [NSBatchUpdateRequest batchUpdateRequestWithEntityName: [RSSItem entityName]]; 
batchRequest.propertiesToUpdate = @{NSStringFromSelector(@selector(read)): @YES}; 
batchRequest.resultType = NSStatusOnlyResultType; // NSStatusOnlyResultType is the default 
batchRequest.affectedStores = @[...]; // Optional, stores this request should be sent to 
batchRequest.predicate = [NSPredicate predicateWithFormat:@"..."]; // Optional, same type of predicate you use on NSFetchRequest 

NSError *requestError; 
NSBatchUpdateResult *result = (NSBatchUpdateResult *)[self.managedObjectContext executeRequest:batchRequest error:&requestError]; 

if (result) { 
    // Batch update succeeded 
} else { 
    NSLog(@"Error: %@", [requestError localizedDescription]); 
} 

但是,它並沒有改變背景:它直接改變了持久性存儲。這意味着沒有進行驗證,您需要更新您的用戶界面後。

這個答案是根據this post by Matthew Morey

+0

將在iOS7設備這項工作? –

+1

我遇到了一個問題,其中result和requestError都是零....並且executeRequest:error:沒有記錄... wat do – Skyler