【发布时间】:2014-09-17 07:22:04
【问题描述】:
有没有办法通过一个 SQL 查询来更新某个实体的所有对象? 不获取和运行循环。
比如喜欢跑步
UPDATE someEntity SET filed1 = value1 WHERE field2 = value2
【问题讨论】:
标签: ios core-data ios7 core-data-migration
有没有办法通过一个 SQL 查询来更新某个实体的所有对象? 不获取和运行循环。
比如喜欢跑步
UPDATE someEntity SET filed1 = value1 WHERE field2 = value2
【问题讨论】:
标签: ios core-data ios7 core-data-migration
Mercelo 的答案不适用于 iOS-7,因为你可以
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];
}
【讨论】:
在 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]);
}
但是,它不会改变 上下文:它会直接改变持久存储。这意味着没有进行任何验证,之后您需要更新您的 UI。
【讨论】: