Подводя итог, я тщательно протестировал свой код, и вот как я воспринимаю ограничения CoreData в отношении выборки и предиката target-c (т. Е. Точечная запись).
Если к объекту был получен доступ из программы Objective-C и если было изменено одно из его свойств или отношений, любой NSFetchRequest с предикатом, использующим точечную нотацию, вернет структуру хранилища SQL, следовательно, результаты будут ошибочными.
В случае тривиального примера Family и Person , если у вас есть ссылка на Family и измените ее имя любой запрос, сделанный для Person NSEntity, не может содержать предикат со следующим элементом запроса
@ "family.name =% @"
Это действительно запрос с использованием фамилии в хранилище SQL. Однако после такого изменения будет работать следующий запрос:
@ "семья =% @"
Действительно, NSFetchRequest по-прежнему будет извлекать информацию из хранилища, но, поскольку структура не изменилась, он заменит объекты, извлеченные теми, которые находятся в памяти, поэтому последующий тест [ фамилия] вернет обновленное имя.
С осторожностью вы можете использовать вложенный предикат, такой как:
@ "person.family.name =% @"
Пока вы можете гарантировать, что все объекты, которые имеют свойство person , не изменили ни их семейство , ни их имя . Если это не так, то вы можете в лучшем случае позвонить
@ "person.family =% @"
Или, если вы не можете гарантировать, что все объекты Family не тронуты, только
@ "человек =% @"
Конечно, альтернативой является систематическое SAVE: NSManagedObjects в постоянное хранилище каждый раз, когда вы вносите какие-либо изменения, поэтому все свойства обновляются, и тогда все вышеприведенные нотации будут работать. Однако бывают случаи, когда вы хотите предотвратить сбережения и заставить клиента изменить свой документ, только если он пожелает (подумайте об инструментах Word, Excel, Picture и т. Д.). Надеюсь, что это поможет.