Helpers - компьютеры, интернет, программирование

Выбор столбца с NSExpression в CoreData

У меня есть объект с двумя столбцами: updatedAtServer и updatedAtLocal.

Когда updateAtServer существует, его следует использовать, в противном случае следует вернуться к updatedAtLocal.

Я хочу сделать запрос, чтобы найти максимальную метку времени с этой резервной логикой, но не могу понять, как это сделать.

В SQL, я думаю, вы могли бы использовать функцию CASE внутри функции MAX:

MAX(CASE WHEN updatedAtServer IS NOT NULL THEN updatedAtServer ELSE updatedAtLocal END)

Как я могу решить это с помощью CoreData?


  • Как будет выглядеть ваш SQL-запрос? Как бы вы решили это в SQL, тогда вы можете работать в обратном направлении. 17.02.2015

Ответы:


1

Одно, возможно, не чистое, но практичное решение — выполнить два запроса. Это не должно влиять на производительность, поскольку подзапросы и т. д., как правило, также приводят к множественным обращениям в магазин.

Демонстрация с предикатами в памяти

NSArray *noServerUpdated = [allItems filteredArrayUsingPredicates:
  [NSPredicate predicateWithFormat:@"updatedAtServer = NULL"];
NSArray *serverOrLocal = [allItems filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"not IN %@", noServerUpdated];
NSArray *serverUpdated = [serverOrLocal filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"updatedAtServer >= updatedAtLocal"];
NSArray *localUpdated = [[serverOrLocal filteredArrayUsingPredicate:
  [NSPredicate predicateWithFormat:@"not IN %@", serverUpdated]
    arrayByAddingObjectsFromArray:noServerUpdated];


NSNumber *maxServer = [serverUpdated valueForKeyPath:@"@max.updatedAtServer"];
NSNumber *maxLocal = [localUpdated valueForKeyPath:@"@max.updatedAtLocal"];
NSNumber *max = [maxUpated compare:maxLocal] == NSOrderAscending ?
  maxLocal : maxUpated;

Возможно, также сначала проверьте наличие пустых результатов.

17.02.2015
  • Спасибо за ответ, но это будет неправильно, так как мне нужно решить, использовать ли сервер или локально для каждого объекта. Таким образом, updatedAtLocal может быть новым для всех объектов, в то время как updatedAtServer очень старый, тогда MAX должен быть самым новым из всех старых отметок времени сервера, поскольку время сервера имеет приоритет для каждого объекта, если оно присутствует. 19.02.2015
  • То, как вы описали проблему, заключается в том, что сервер переопределяет локальный, что и делает приведенный выше код. Адаптируйте решение к своим потребностям, но не меняйте проблему после того, как получите правильный ответ. 19.02.2015
  • Он переопределяет для каждого объекта, а не для расчетного максимума для каждого столбца. В моем примере у меня есть CASE в MAX. Ваше решение состоит в наличии CASE, связанной с двумя операциями MAX. Итак, вы только что немного неправильно интерпретировали вопрос, но, пожалуйста, отредактируйте свой ответ, если вы знаете ответ, и я с радостью отмечу его как правильный! :) 20.02.2015
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..