Как вы можете использовать дескрипторы сортировки и предикаты с трансформируемыми полями основных данных? - PullRequest
2 голосов
/ 04 октября 2010

У меня есть приложение, которое я написал, которое раньше работало отлично.Существует новое требование, что все данные должны быть зашифрованы сейчас, поэтому я реализовал шифрование, сделав все свои основные типы полей данных преобразовываемыми и записав собственные преобразователи для каждого типа данных, которые шифруют / дешифруют каждый элемент данных, когда они записываются / считываются изосновное хранилище данных.

Шифрование работает нормально, и я вижу все данные.Проблема в том, что сортировка, по-видимому, нарушена, как и любые даже немного сложные предикаты (те, которые включают подзапросы).

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

Ситуация с предикатами - еще большая проблема.Странно, что кажется, что это в основном работает, но затем перестает работать, когда я делаю подзапросы (которые похожи на соединения между двумя объектами в отношениях).Есть ли известная проблема при использовании преобразуемых значений и предикатов или, возможно, у меня есть ошибка в моих преобразователях?

Вот пример предиката, который больше не работает:

[NSPredicate predicateWithFormat:@"isdeleted == NO AND (SUBQUERY(appuserMessages, $am, $am.recAppUserID == %@ AND $am.isTrash == NO).@count > 0)", appuserid];

Предикатвыполняется для объекта Messages, который имеет отношение один ко многим с AppuserMessages.Предполагается, что этот предикат возвращает все сообщения, которые не были удалены и имеют по крайней мере одно appuserMessage, где recAppUserID равен appuserid, а isTrash - false.Раньше работал, но теперь ничего не возвращает.

1 Ответ

1 голос
/ 08 октября 2010

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

Дескрипторы сортировки тоже не будут работать, и понятно почему. Сортировку оставляют делегированному ядру базы данных, так что сортировка выполняется по предварительному преобразованию строк. В моем случае это означает, что они сортируются на основе их (случайных) зашифрованных значений вместо расшифрованных.

Единственное решение, по-видимому, заключается в извлечении строк в изменяемый массив и последующей сортировке массива (с использованием sortWithDescriptors).

Что касается подзапросов, я предполагаю, что это аналогичная проблема. Вероятно, подзапрос выполняется предварительным преобразованием ядра СУБД и поэтому всегда дает сбой. Опять же, решение состоит в том, чтобы сделать как можно более сложный запрос в выборке, а затем в оставшейся части запроса (часть подзапроса) с фильтром изменяемого массива результатов.

...