Как правило, когда вы сталкиваетесь с необходимостью использовать подзапрос в предикате, который часто является признаком того, что вы столкнулись с проблемой проектирования. Обычно это означает, что (1) ваша выборка против неправильной сущности или (2) ваша модель данных является неоптимальной.
В этом случае, я думаю, что это (2).
Давайте сделаем следующие предположения относительно ваших требований.
- Вы загружаете несколько версий одного и того же имени файла с сервера.
- Каждый файл хранится вне Core Data, и вам нужно только указать имя файла, путь к файлу на диске и время загрузки в самих Core Data.
Затем вы можете упростить модель данных до:
DownFile{
name:string
path:string
downloadTime:date
}
Каждый экземпляр DownFile
хранит информацию для одного загруженного файла. У вас может быть много файлов с одинаковым именем (или номером идентификатора, или другим идентификатором), но каждая версия имени файла будет иметь уникальный путь на диске и уникальную метку времени загрузки.
Чтобы найти последнюю загружаемую версию файла с конкретным именем, вы должны использовать предикат только для имени.
NSPredicate *p=[NSPredicate predicateWithFormat:@"name == %@", soughtName];
Затем вы можете предоставить дескриптор сортировки, который сортирует по дате, помещая самую последнюю дату вверху:
NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey: @ "downloadTime" по возрастанию: НЕТ];
Когда вы запускаете выборку с указанным выше предикатом и сортируете, он возвращает массив всех экземпляров DownFile
, которые имеют то же имя, что и переменная soughtName
, и все они отсортированы по убыванию. Чтобы найти последнюю загруженную версию, просто получите нулевой элемент массива.
Помимо того, что этот дизайн более прост, он намного быстрее, чем запуск подзапросов для огромного числа объектов.
Даже если эта конкретная модель не будет работать для вас, она должна предоставить вам отправную точку. Базовые данные предназначены для моделирования / симуляции реальных объектов, условий или событий и отношений между ними. Поэтому ваша модель должна отражать то, что действительно происходит. В этом случае у вас есть
downloaded files -->> Object
download time -->> Event
Поскольку каждый файл уникален только по времени загрузки, вам нужно сделать это главным атрибутом объекта, который моделирует файлы. (Обратите внимание, что объект моделирует единичные экземпляры реального объекта, условия или события.) Объект DownFile
позволяет моделировать / моделировать один файл реального мира по названию местоположения и критическому событию его времени загрузки.
Поскольку объект тесно моделирует реальность, это делает выборку реальных экземпляров объекта намного, намного проще