2012-03-05 4 views
19

Я искал статью, в которой объясняются преимущества и недостатки NSCoding (NSKeyedArchiver ...) использования CoreData (SQLite ....).NSCoding VS Основные данные

Существует множество опций, я могу реализовать свой собственный бинарный считыватель/запись или использовать plists/xml/json ... или использовать SQLite или NSCoding.

Я сейчас потерялся. Может ли какой-либо орган объяснить, в чем разница между основными функциями?

+2

Возможные дубликаты: http://stackoverflow.com/questions/4989609 http://stackoverflow.com/questions/840634 –

+2

вещь sqlite считается внутри coredata. И первая ссылка, которую вы предложили, говорит о специфическом sqlite3 vs nscoding; с небольшим количеством ответов. Я задаю более общие вопросы. Почему существует так много вариантов обработки данных. – LolaRun

ответ

30

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

NSCoding, как правило, является сериализатором данных. Множество встроенных объектов реализует протокол NSCoder, который позволяет сохранять их как двоичный поток (файл, в BLOB sqlite и т. Д.). NSKeyedArchiver дает вам возможность поиска в таких потоках на основе строковой метки , немного похоже на словарь, но вы можете использовать только строки в качестве ключей. Этот подход хорош, если вам иногда приходится упорствовать над некоторыми объектами разных классов.

Однако если у вас есть много объектов же класса, вы будете лучше пойти на базе данных, подход, SQLite или CoreData. CoreData - это практически оболочка SQLite, которая упрощает проектирование вашей модели данных и выполняет запросы к БД за шторами, не требуя написания операторов SQL. В CoreData вы определяете свои классы, и каждый экземпляр класса может сохраняться, т. Е. Вы можете вернуть значения членов объекта, не имея их всегда в памяти. Это очень удобный способ хранения множества структурированных данных. Например, если вы напишете веб-браузер, вы можете сохранить закладки пользователя с именем, URL-адресом и, возможно, последним посещенным временем.

Для XML и JSON нет особых преимуществ, если вы используете данные только локально на устройстве. Если вам нужно связаться с какой-либо внешней службой, вы можете рассмотреть возможность кэширования/сохранения объектов XML/JSON, как они предназначены для последующего использования. Другим подходом было бы восстановление этих данных из ваших внутренних структур данных (см. Выше) каждый раз, когда вам это нужно.

Если вы сами проектируете свою модель данных, я вижу еще меньше смысла использовать плиты, но, возможно, кто-то меня исправит.

EDIT: Я добавлю ссылку на короткую ссылку для учебных пособий о том, как использовать NSCoding, Core Data и в качестве бонуса SQLite.

ОБНОВЛЕНИЕ 12.01.2016: Если вы ищете решения настойчивости, я предлагаю вам также ознакомиться с Realm.

+0

, если блочные файлы sqlite сериализованы, это может означать, что сериализация лучше всего для получения наименьших фрагментов двоичных данных. Также вы можете использовать NSCoding для conditionalObjectEncodings, который удаляет дублирование экземпляров живого объекта в памяти. Причина, по которой я задаю этот вопрос, заключается в том, что все говорят и предлагают Coredata-SQLite, но я не вижу ТОТ-преимущества. Если вы не строите против огромного источника данных, и вы не можете поместить все это в память. Я прав? – LolaRun

+2

Всегда есть баланс между памятью и оптимизацией производительности. С NSCoding или вашим пользовательским двоичным представлением у вас гораздо больше контроля над битами, которые записываются в хранилище или хранятся в памяти, но для этого вам нужно заплатить цену за кодирование, тем самым эффективность кода будет зависеть от вашего способности. С CoreData/SQLite для вас реализовано много полезных вещей (поиск, запрос, индексирование, объединение и т. Д.). Примечание. Объекты CoreData загружаются в память только тогда, когда это необходимо, в противном случае они остаются в db. – MrTJ

+0

Отлично. Поэтому, если я использую шаблон приложений ApplicationDocument, и если мне нужно сохранять и открывать документы, мне бы не нужны преимущества CoreData, так как мне нужно загружать все в память и не нужно запрашивать и ... функциональность базы данных. Основное различие заключается в стоимости разработки. Что в моем случае не является неудачей. Большое спасибо. Я подожду немного, чтобы привлечь больше ответов и больше обсуждений, прежде чем принимать ответ – LolaRun

3

Всегда существует импеданс между объектами и реляционными структурами. Я всегда предпочитаю объекты, поскольку доступ к данным обычно является частью функциональности вашего приложения. С NSCoding вы получаете простоту, легкость отладки и управление с очень маленьким кодом для записи в любом случае. У вас также есть возможность включить NSCoding в структуры базы данных.

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

8

Мэттт Томпсон обеспечивает усваиваемый разбивку различных различий между NSCoding, Core Data и NSKeyedArchiver на NSHipster: http://nshipster.com/nscoding/

+1

спасибо, это ясное объяснение. – LolaRun

2

Чтобы добавить к уже большие ответы, NSCoding вместе с NSKeyedArchiver является отличным способом для хранения данных, которые слишком большой (или несовместимый тип данных) для NSUserDefaults, но слишком маленький и не многочисленный для CoreData.