2

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

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

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

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

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

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

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

ответ

1

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

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

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

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