CoreData или SQLite для агрегации iOS

У меня есть приложение для iPhone, для которого требуется локальное хранилище.

Моя первоначальная мысль состояла в том, чтобы использовать базовые данные, что подходит для большей части приложения, однако основная часть использует агрегирование данных. В SQLite это стандартное использование MIN, MAX, AVG, GROUP_BY и т. д.

Но базовые данные не очень хорошо это реализуют, так как они в первую очередь предназначены для управления графом объектов. Будет ли иметь значение, если я буду выполнять вычисления в Obj-C после загрузки из CoreData, или мне следует придерживаться SQLite и отказаться от полезности других частей системы CoreData?

Коллекции для агрегирования невелики (скажем, не более 100 объектов). Мне нужно делать такие вещи, как дистрибутивы.

Я знаю, что здесь нет конкретного ответа, просто хотелось бы несколько вторых вариантов. Спасибо


person Cameron    schedule 09.12.2011    source источник


Ответы (3)


Я использую в своем приложении как Core Data, так и FMDB (оболочку Objective-C для SQLite), и все работает нормально. Core Data добавляет «Z» перед вашими именами таблиц и полей, поэтому, например, если у вас есть объект Core Data с именем «Контакты», вы можете выполнить такой запрос, как SELECT COUNT(*) FROM ZCONTACTS, и он вернет вам результаты SQL-запроса. .

person BP.    schedule 09.12.2011
comment
Это звучит как интересная идея, но разве смысл CoreData не в том, чтобы абстрагироваться от дБ? Если Apple изменит реализацию базовой схемы, у вас не возникнет проблем? - person Cameron; 10.12.2011
comment
Это правда, но я использовал эту технику в приложениях от iOS 3.0 до текущей версии 5.0, и все они работают нормально. Кроме того, я не думаю, что Apple изменит эту схему в ближайшее время, но всегда следует проводить тестирование, когда Apple вносит серьезные изменения в ОС. - person BP.; 11.12.2011

Лично я бы остался с CoreData до тех пор, пока «большая часть приложения» не использует MIN, MAX, AVG... потому что тогда все еще «большая часть приложения» все еще много, чем с SQLite.

person V1ru8    schedule 09.12.2011

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

NSManagedObjectContext context; // Get it some how
NSManagedObject *obj = [context objectWithID:objectID];

для получения соответствующего управляемого объекта.

person Ulrich von Poblotzki    schedule 09.12.2011
comment
Не уверен, что следую. Агрегации довольно динамичны, я не понимаю, как я могу легко кэшировать их в свои собственные объекты. - person Cameron; 10.12.2011