iOS: не удается скомпилировать модель CoreData из-за извлеченных индексов в Xcode 9

Согласно примечаниям к выпуску, Xcode 9 добавляет поддержку извлеченных индексов:

«Редактор модели данных представляет собой унифицированный интерфейс для новой функции индексов выборки Core Data, а также для существующих функций индекса свойств и составного индекса сущностей. Старые модели данных переводятся в форму индекса выборки для редактирования и при необходимости сохраняются в старом формате файла. . Компиляция модели данных с целью развертывания ниже iOS 11, watchOS 4, macOS 10.13 или tvOS 11 продолжает создавать совместимую скомпилированную форму. (30843153)"

В моем проекте цель развертывания установлена ​​​​на iOS 9 на данный момент, но я не могу скомпилировать свою модель CoreData, она дает мне следующие ошибки для каждой сущности, для которой установлен составной индекс:

Model.xcdatamodeld/Model.xcdatamodel:MyEntity|compoundIndex[0]: error: Expression requires a concrete result type.  
Model.xcdatamodeld/Model.xcdatamodel:MyEntity|compoundIndex[0]: error: Expression attributes are not compatible with the current deployment target.  
Model.xcdatamodeld/Model.xcdatamodel:MyEntity|compoundIndex[1]: error: Expression requires a concrete result type.  
Model.xcdatamodeld/Model.xcdatamodel:MyEntity|compoundIndex[1]: error: Expression attributes are not compatible with the current deployment target.  
Model.xcdatamodeld/Model.xcdatamodel:MyEntity: error: Fetch Indexes feature requires iOS deployment target 11.0 or later  
Model.xcdatamodeld/Model.xcdatamodel:MyEntity: error: Fetch Indexes feature requires Xcode 9.0 tools or later  

Любая идея, как исправить ошибку сборки?

ОБНОВЛЕНИЕ:

Xcode 9 правильно преобразует составные индексы в индексы выборки для всех случаев, кроме тех, которые созданы из отношений, как указано в разделе «Известные проблемы»:

В этой бета-версии редактор модели данных поддерживает создание индексов выборки только из атрибутов и выражений, а не из отношений. (32407895)

Затронутые индексы выборки выглядят следующим образом, и в раскрывающемся меню можно выбрать только атрибуты:

введите описание изображения здесь

Однако обходной путь в документе не описан.


person Tom Kraina    schedule 06.06.2017    source источник


Ответы (4)


Я только что столкнулся с этой проблемой в Xcode 9 GM. Я заметил, что снятие флажка Ascending в редакторе индексов привело к возникновению этой ошибки (она появлялась только после того, как я создал новый индекс). Я предполагаю, что настройка этого атрибута индекса поддерживается только в индексах выборки iOS 11 (вы заметите, что любой индекс, который вы сделали до Xcode 9, по умолчанию указан как возрастающий).

TL;DR: убедитесь, что флажок Ascending установлен для всех свойств в редакторе выборочного индекса.

person Charles A.    schedule 14.09.2017

Это исправлено в Xcode 9 beta 2 в соответствии с примечаниями к выпуску:

Редактор модели данных Xcode поддерживает создание индексов выборки из атрибутов, выражений и отношений. (32407895)

person Tom Kraina    schedule 22.06.2017
comment
Я преобразовал свой проект в Xcode beta 5 или 6, и это было нормально для моих целей iOS 10, но мое расширение SiriKit только для iOS 11 — нет. Он говорит мне, что индекс является дубликатом, но я не могу найти обман. Я опубликую ответ здесь, как только найду решение. - person AlexK; 07.09.2017

Я сообщил об ошибке в Apple, так как, похоже, нет хорошего решения. На данный момент я изменил «Версия инструментов» с Automatic/Xcode 9 на Xcode 8. Это устранило мою проблему, пока ошибка не будет исправлена.

Также возможно, что некоторые модели просто несовместимы с новыми индексами. В моем случае это были модели-подклассы (то есть из абстрактных классов), которые имели отношения к другим типам. Например:

PIFolder
|
|-----PIFolderProject -> index: defaultItem (task relationship)
|-----PIFolderNotebook-> index: defaultItem (note relationship)
person AlexK    schedule 07.09.2017
comment
Теперь у меня возникла эта проблема с выпуском Xcode 9. Как изменить версию инструментов на Xcode 8? - person Molanda; 20.09.2017
comment
Нажмите на модель. Откройте панель утилиты справа. Отобразите инспектор файлов (почти всегда мини-вкладка слева от панели «Утилиты»). Должно быть свойство для документа и того, в какой версии он может открываться. - person AlexK; 16.10.2017

Я пришел сюда после получения

cdtool[0] Объект уже имеет индекс с именем

При попытке обновить базовую цель до iOS 11.

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

До iOS 11 имена индексов не были уникальными, поэтому у меня было 2 byRankIndex. Изменение их на уникальные имена исправило это.

person ahbou    schedule 11.11.2020