Базовые данные VS Sqlite или FMDB ....? - PullRequest
36 голосов
/ 04 января 2012

Теперь это может выглядеть как дублирующая тема, но мой вопрос в том, что я прочитал много вопросов, таких как .. Базовые данные против SQLite 3 и другие, но им 2-3 года.Я также читал, что FMDB был разработан, поскольку основные данные не поддерживаются в iOS, поэтому его больше не следует использовать.А с другой стороны, я прочитал, что не следует использовать основные данные в качестве базы данных.

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

Ответы [ 6 ]

45 голосов
/ 05 января 2012

Анкит,

Вот вам скин: используйте Core Data.

Вот длинная форма:

Несмотря на то, что вы можете использовать множество критериев для выбора между Базовыми данными, ORM (FMDB) или прямыми вызовами sqlite, реальная стоимость этого выбора зависит от вашего времени его использования, поддержки Apple и использования других проектов. (RESTKit, который отображает службы REST на Core Data, популярен в наши дни.)

Следовательно, большой процент времени, скажем, 90 +% (вымышленная статистика), ответ на iOS будет использовать Core Data. Зачем? Как только вы освоите его и создадите несколько маленьких вспомогательных методов, Core Data удерживает вас в согласованном вычислительном мире - графе объектов Objective-C. Core Data научит вас тому, как использовать динамический язык, который поможет каждому другому аспекту вашего программирования на iOS. Следовательно, вы более продуктивны. Не борись за рамки.

Если вы переносите большую и сложную базу данных и схему SQLite из другого приложения, тогда может быть экономически эффективным использование либо FMDB, либо SQLite. Но я сомневаюсь в этом. Написание простого приложения для командной строки на основе Mac для переноса БД в БД базовых данных является конечной и простой задачей. Вам почти гарантировано придется переписать большую часть бизнес-логики в Objective-C. (Да, C ++ и Objective-C ++ - хорошие технологии. Действительно ли ваша бизнес-логика базы данных была настроена для работы на устройстве с ограниченным объемом памяти? Я так не думал.)

Базовые данные получают высокую оценку производительности. Это действительно довольно быстро. Вы просто должны использовать его по-другому, чем вы используете БД. В частности, вы почти всегда извлекаете данные из хранилища, а затем уточняете их, используя предикаты непосредственно в различных наборах и массивах. На устройствах iOS, где флэш-память на удивление медленная, эта стратегия избыточного извлечения особенно эффективна. На самом деле у вас много оперативной памяти на этих устройствах, используйте ее для увеличения производительности. (Да, я знаю, что это явное противоречие моему вышеописанному стуку в переносимой бизнес-логике. Но на самом деле код, перенесенный из среды рабочего стола или сервера, имеет так много неявных предположений о скорости диска, объеме памяти и реальности виртуальная машина с резервным хранилищем, она просто не будет хорошо работать на устройстве с ограниченным объемом памяти, работающим от батареи, с модной моделью памяти. [Она также не будет работать очень хорошо на устройствах Android.]) Вы также денормализуете свои данные, чтобы упростить отображать его в различных виджетах интерфейса iOS и Mac OS X. Есть несколько приложений, в которых Core Data будет работать медленнее, чем эквивалентная БД SQLite. Это было подробно описано в другом месте. Одно из главных утверждений состоит в том, что задачи, в которых идентификаторы определяются исходными базами данных, соответствуют производительности Core Data. Но это может быть несколько смягчено разумной индексацией и перебором.

Следует помнить и о мобильных устройствах: размер базы данных, поскольку это мобильные устройства в Интернете, обычно скромный. Следовательно, производительность легче достичь. Многие уроки из мира серверов могут не относиться к этому мобильному миру с батарейным питанием.

Другими словами, вам пришлось пойти ва-банк, чтобы использовать Objective-C в iOS / Mac OS X, вы также получите некоторые важные преимущества в производительности благодаря использованию Core Data.

Andrew

38 голосов
/ 22 апреля 2013

Я недавно отправился в это путешествие сам и в итоге попробовал все три. Вот что я узнал:

  • Сырье sqlite3
    • Низкоуровневый, полный доступ к базе данных. Нет абстракций. Очень многословно - для выполнения очень простых вещей требуется много кода.
  • Основные данные
    • Очень высокий уровень, построенный на абстракциях, ДОЛЖЕН использовать сгенерированную базу данных Apple. Полезно для синхронизации iCloud и простого управления данными только для iOS. Сложный и опасный прямой доступ к базе данных, и его не следует использовать для кроссплатформенных баз данных. Тем не менее, для выполнения простых задач требуется достаточно много кода.
  • FMDB
    • Высокий уровень, очень дружелюбный, но не принудительный. Тем не менее получить полный доступ к базе данных, если вам это нужно. Предоставляет NSDictionary результата с каждым типом, автоматически типизированным с изменяемым вариантом правильного типа данных (например, текстовые столбцы возвращаются как NSMutableString). В итоге я создал очень простой класс-оболочку, чтобы абстрагировать его еще больше, поэтому у меня есть вспомогательный класс со статическими функциями, такими как selectAllFrom:(NSString *)table where:(NSDictionary *)conditions, который возвращает NSArray из NSDictionary объектов. Это потрясающе иметь возможность делать такие вещи, как NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}];.

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


TL; DR:

  • Не используйте raw sqlite3, если вы не делаете что-то чрезвычайно тривиальное.
  • Базовые данные хороши для простых данных только для iOS, если вам удобно быть заблокированными в них.
  • Если вам нужен полный контроль над базой данных, и вы не делаете что-то тривиальное, или вы создаете свое приложение для нескольких платформ, FMDB, безусловно, является подходящим вариантом.
8 голосов
/ 04 января 2012

Я использую FMDB для всех моих проектов, которые интенсивно используют "INSERT s", а FMDB не устарел. Последний коммит на Github был в ноябре прошлого года. Если вы используете SQL, я рекомендую вам использовать FMDB.

Базовые данные подходят для 95% всех проектов, но, если речь идет об оптимизации, нужно работать на стене. Если вы хотите использовать преимущества Core Data (OOP, ...), используйте их. Если у вас много вставок удаляет с "WHERE" пользователь Sqlite (FMDB)

Это POST объясняет отключение и верхний сайт для Core Date против Sqlite (FMDB)

6 голосов
/ 05 января 2012

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

Как всегда: это действительно зависит от вашего варианта использования. Но в 99% случаев CoreData - правильный выбор.

Если производительность критична, вам все равно нужно понимать, как работает база данных. Но CoreData может обеспечить такую ​​производительность, если вы используете ее правильно. Но это занимает некоторое время, чтобы учиться. Есть много вещей, которые тривиально сделать в CoreData, которые очень сложно сделать в FMDB.

2 голосов
/ 28 октября 2015

Как новый SQL-парень, я добавлю два цента:

В Core Data у вас есть немного «стандартного» кода, который вам нужно вставить, прежде чем вы действительно сможете использовать свою базу данных. Вашему приложению нужен хотя бы один из них:

  1. Постоянный координатор магазина
  2. Контекст управляемого объекта
  3. Управляемый объект. Это соответствует сущности, которая соответствует таблице, если вы используете базу данных SQLite.

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

С другой стороны, у нас есть SQLite, который, на мой взгляд, гораздо проще понять. Для начала вам понадобится:

  1. База данных
  2. Таблица или более (в зависимости от ваших данных)
  3. Знание SQL - гибкий язык с упрощенным синтаксисом (запросы SELECT делают больше, чем вы могли изначально думать)
  4. Объект, через который ваше приложение взаимодействует с SQLite.
0 голосов
/ 04 января 2012

Базовые данные - это только абстракция объекта базы данных SQLite3.Это означает, что у вас будут постоянные объекты, которыми легко управлять для стандартных операций с базой данных.Вы также можете работать в транзакционном режиме и проектировать структуру базы данных основных данных в XCode, создавая модели.

Если вам не нужно вручную создавать базу данных SQLite3 или постоянные методы, используйте Core Data.

...