Swift - Как массово обновить объекты без перебора коллекции объектов области - PullRequest
0 голосов
/ 06 июня 2019

У меня есть почти сто тысяч записей в моей realmDB, и я хочу пересчитывать определенное свойство каждый раз, когда пользователь меняет часовой пояс устройства на основе другого свойства в той же таблице.

Пример:

    class Activity: Object {
        // In UTC received from server
         dynamic var effectiveDate: Date? 
        // Needs to be re-calculated everytime user launches the app based on `effectiveDate`
         dynamic var effectiveDay: Date? 
   }

Предположение: у меня есть 100 000 таких записей активности в моей таблице областей под названием Activities

Кроме того, область заявляет, что применение KVC к коллекции является отличным способом массового обновления объектов безнакладные расходы на итерацию по коллекции при создании средств доступа для каждого элемента.

В моем случае вместо установки одинакового значения для каждой записи я хочу пересчитать effectiveDay на основе свойства effectiveDate длякаждая запись с использованием KVC, чтобы избежать накладных расходов итераций.Возможно ли это?

1 Ответ

1 голос
/ 06 июня 2019

Краткий ответ:

Это невозможно без перебора коллекции объектов области.

Длинный ответ:

realm - это база данных на основе модельного класса.Он не поддерживает какой-либо запрос (Предикаты или Фильтр, в основном используемые для извлечения данных с определенным условием), например, SQLite означает, что мы не можем обновить все записи в одном запросе с помощью realm.Так что ответ на ваш вопрос довольно прост, без итерации мы не сможем обновить значение.

Вы можете улучшить производительность, если хотите изменить значение какого-либо объекта.

Код:

let persons = realm.objects(Person.self).filter("id IN %@", ids)
try! realm.write {
    persons.first?.setValue(true, forKeyPath: "isFirst")
    // set each person's planet property to "Earth"
    persons.setValue("Earth", forKeyPath: "planet")
}
...