Несколько пунктов. Если для получения 21 500 строк потребуется 5 секунд, похоже, что вы работаете на более старом устройстве. Как 3G или оригинальный iPhone. Производительность памяти и ввода-вывода на них просто медленная. Вам нужно будет обращаться с вашими данными с особой осторожностью, чтобы не читать все это в памяти и делать ненужные операции ввода-вывода. Вы можете найти -setFetchBatchSize особенно полезным. Если вы работаете в 3GS, 10-20 тысяч строк управляемы, но потребуют осторожности. Если вы находитесь на ipad или iphone4, это не должно быть большой проблемой.
Вам не нужно создавать свой собственный UUID, кроме как для интерфейса с внешней системой, например с сервером. Каждый управляемый объект имеет идентификатор объекта, который представляет собой представление ООП первичного ключа. Просто передайте объект ID вокруг и делайте запросы типа @ "self =% @" или @ "self IN% @" для поиска объекта по его идентификатору или массиву идентификаторов. Вы также можете использовать -existingObjectWithID: error: для поиска только одного объекта по его объектуID, который будет быстрее, чем общий запрос выборки с общим предикатом.
Лучший способ проверить индекс используется как вы ожидаете, это запустить приложение в симуляторе с исполняемым аргументом
-com.apple.CoreData.SQLDebug 1
, который будет войти в консоль генерируется SQL. Вы должны увидеть, что некоторые вещи заканчиваются чем-то вроде t0.uuid ==?
Вы можете принять этот оператор выбора SQL и запустить его через средство запроса запросов SQLite. Запустите/usr/bin/sqlite3 против файла db в симуляторе.Есть
.explain ON explain query plan copythatsqllinehere
он должен напечатать что-то вроде 0 | 0 | ТАБЛИЦА ZFOO AS t0 с индексом то
, если он отсутствует «с индексом», то вы какой-то вопрос или с тем, как вы создали Сердечник Хранилище данных (вы уверены, что модель помечена как индекс uuid?), Или есть что-то еще с вашим запросом на выборку.
This is really surprising. If I wanted to fetch every object in my store, one by one, it >would take nearly 4.5 hours!
Я полагаю, вы могли бы сделать это таким образом, как один из самых болезненных способов. Или вы можете использовать -setFetchBatchSize: и очень быстро перебирать партии объектов.
Кроме того, имейте в виду, что каждая выборка делает I/O с базой данных, чтобы оставаться в синхронизации с тем, что сохранялись в других потоках. Извлечение - это не волшебный словарь. В то время, когда требуется выполнить наименьшую единицу ввода-вывода, существует нижняя граница. Вы захотите амортизировать количество индивидуальных запросов ввода-вывода, чтобы получить максимальную производительность. Вам придется балансировать, чтобы не перечитывать слишком много в память сразу.
Если вы по-прежнему есть проблемы, пожалуйста, сообщите об ошибке с bugreport.apple.com
Чтобы сравнить, я попытался собрать всю таблицу из 21 500 строк и использовать результаты для создания NSDictionary с UUID в качестве ключей. Затем я повторял весь словарь, один за другим, по каждому UUID и возвращал каждый объект. Весь этот процесс занимает всего около 5 секунд. – Mike