Существует ли операция массового обновления для всех объектов в Базовых данных? - PullRequest
4 голосов
/ 10 ноября 2009

На iPhone есть ли у Core Data способ массового обновления поля для каждого экземпляра сущности, которую он хранит? Что-то вроде

обновить some_entities установить some_count = 0, где some_count> 0

Или мне просто нужно создать экземпляр каждой сущности, установить значение и сохранить его? (И если это ответ, как я могу сделать это в одной транзакции, если набор слишком велик для размещения в памяти?)

Ответы [ 3 ]

7 голосов
/ 10 ноября 2009

Это не предусмотрено Core Data, но вы можете использовать метод makeObjectsPerformSelector:withObject: для NSSet или NSArray ваших управляемых объектов Core Data.
Передайте метод доступа сеттера в качестве селектора, а значение - в качестве объекта.

Например, если управляемые объекты имеют атрибут «имя», который должен быть одинаковым для всех:

[[fetchedResultsController fetchedObjects] makeObjectsPerformSelector:@selector(setName:) withObject:@"name for all"];

Вам не нужно иметь NSFetchedResultsController. Вы можете использовать массив из NSFetchRequest или даже NSSet из отношения ко многим среди ваших основных данных.

4 голосов
/ 10 ноября 2009

Базовые данные не являются базой данных. Если вы хотите массово обновить объекты, вам придется их извлекать и обновлять значения самостоятельно.

Хороший способ сделать это - выбрать, скажем, 100 за раз (используя NSFetchRequest с набором fetchLimit), обновить их, а затем сохранить контекст управляемого объекта. Вспенить, промыть, повторять до тех пор, пока все объекты не будут обновлены.

И, как предположил Джерри, если обновление, которое вы делаете, простое, вы можете использовать makeObjectsPerformSelector:, чтобы выполнить обновление в одну строку.

2 голосов
/ 10 ноября 2009

Нет, Core Data не имеет функции массового обновления. Если вы ограничены в памяти, вы можете подумать о том, чтобы изменить модель данных, чтобы упростить ее; вместо сохранения абсолютного количества для каждого объекта, отследите главное значение для группы объектов и сохраните дельту от этого значения для каждого объекта.

Базовые данные могут определенно разочаровывать тех, кто привык думать в терминах SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...