Запрашивать основное хранилище данных на основе переходного вычисленного значения - PullRequest
0 голосов
/ 26 октября 2011

Я довольно плохо знаком с более сложными частями Core Data.

В моем приложении есть хранилище базовых данных с 15K строками.Существует один объект.

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

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

Гипотетический пример:

Entity: содержит поля "id", "first "и" second "

Вводимые пользователем данные: 10 и 20

Критерии поиска / фильтрации: отображать только записи, в которых поле сущности" id "является простым числом между двумя предоставленными числами.(Мне нужно создать какой-нибудь метод сложных предикатов здесь, я полагаю?)

Отображение: все поля всех записей, которые соответствуют критериям, вместе с производным полем (не в основном объекте данных), который являетсясумма поля "id" и случайного числа, поэтому каждая строка в табличном представлении будет содержать 4 поля:

"id", "first", "second",-вычисляемое значение-

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

Может ли кто-нибудь дать мне указатели, которые помогут мне реализовать этот код?Сейчас я довольно растерян, и примеры, которые я могу найти в книгах и т. Д., Не соответствуют моим конкретным потребностям настолько, чтобы я смог адаптировать их, насколько я могу судить.

Спасибо

Даррен.

1 Ответ

1 голос
/ 27 октября 2011

Первое, что вам нужно сделать, это перестать думать в терминах полей, строк и столбцов, поскольку ни одна из этих структур на самом деле не является частью Базовых данных. В этом случае это важно, потому что Core Data поддерживает произвольно сложные выборки, а хранилище sqlite - нет. Таким образом, если вы используете хранилище sqlite, ваши выборки будут ограничены теми, которые поддерживаются SQLite.

В этом случае предикаты, нацеленные на SQLite, не могут выполнять сложные операции, такие как вычисление, является ли значение атрибута простым.

Лучшим решением для вашего первого случая было бы добавить логический атрибут isPrime, а затем изменить установщик для атрибута id, чтобы вычислить, является ли заданное значение идентификатора простым или нет, а затем установить isPrime соответственно. Это будет храниться в хранилище SQLite и может быть получено, например, с isPrime==YES &&((first<=%@) && (second>=%@))

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

Один из часто пропускаемых вариантов - не использовать хранилище sqlite, а вместо этого использовать хранилище XML. Если количество данных относительно мало, например, несколько тысяч текстовых атрибутов с общим объемом памяти в несколько десятков мегабайт, тогда хранилище XML будет очень быстрым и сможет обрабатывать более сложные операции.

SQLite - своего рода чахлый пасынок в Core Data. Это полезно для больших наборов данных и нехватки памяти, но с ростом памяти становится все больше, теряя свои преимущества. Я использую это меньше в эти дни. Вы должны подумать, нужен ли вам sqlite в данном конкретном случае.

...