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

янное хранение данных на iPhone обычно выполняется с использованием Core Data или sqlite3. Большинство людей предпочитают использовать NSUserDefaults в качестве хранилища для настроек приложения, а не использовать его в качестве обычной базы данных (такой как sqlite).

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

Обновить:
Я часто использую три разных способа сохранения моих данных на диск.

Основные данныеСериализация объектов в спискиNSUserDefaults

Я больше не использую FMDB (или sqlite напрямую). Каковы основные преимущества и недостатки каждого подхода?

Некоторые преимущества NSUserDefaults, с которыми я столкнулся:

Сортировка, группировка и т. Д. Могут быть легко выполнены с помощью NSPredicate.NSUserDefaults является потокобезопасным.Для извлечения и сохранения данных в NSUserDefaults требуется одна строка.
 Viktor Apoyan30 мая 2011 г., 09:55
sqlite3 более эффективен для хранения большой базы данных, поиск более быстрый и имеет много привилегий.
 Viktor Apoyan30 мая 2011 г., 09:58
Первое и главное преимущество заключается в том, что вы можете очень быстро сортировать, группировать, искать в базе данных sqlite3
 SEG30 мая 2011 г., 09:58
но вызывает ли хранение данных в nsuserdefaults какие-либо проблемы при большом количестве данных? какие привилегии есть у sqlite3?

Ответы на вопрос(4)

элементам базы данных. Вы можете сортировать элементы базы данных Sqlite3, вы можете очень быстро искать элементы в базе данных Sqlite3. База данных Sqlite3 имеет много привилегий, которыеNSUserDefaults не было!

NSUserDefaults против Sqlite3

NSUserDefaults для пользовательских настроек, обычно это базовые объекты, такие как NSString или NSNumber. Sqlite, сериализация коллекции объектов в списке свойств или Базовые данные - все это допустимые параметры для хранения пользовательских данных, таких как созданные вами объекты модели.

Вы не увидите разницу в скорости, но все же лучше выбрать правильный механизм для того, что вы делаете. Если это просто настройки, используйте NSUserDefaults, в противном случае я бы сериализовал ваши объекты в plist. Если вы новичок в Какао, я бы сначала отказался от Core Data и даже от Sqlite, чтобы дать себе возможность сначала изучить основы.

NSUserDefaults или Sqlite

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

Использование NSUserDefaults для сохранения большого количества игровых данных

Обычно NSUserDefaults используется для сохранения настроек игры. Чтобы сохранить игровые данные, обычно лучше использовать либо SQLite, либо вы можете создать NSDictionary объектов и сохранить на диск, вот пара постов, которые могут помочь:

http://www.cocos2d-iphone.org/forum/topic/9308http://www.cocos2d-iphone.org/forum/topic/9210
 rptwsthi08 янв. 2013 г., 06:52
@ViToBrothers, что если мы будем хранить словарь в NSUserDefaults?
 Viktor Apoyan30 мая 2011 г., 14:13
;) пожалуйста ...
 Viktor Apoyan30 мая 2011 г., 10:12
У вас есть вопрос?
 SEG30 мая 2011 г., 13:56
На самом деле, нет. Это то, что я хотел знать. Благодарю.
 rptwsthi20 апр. 2014 г., 20:13
@vishman мы можем хранить столько данных, но это никогда не будет хорошей практикой. У вас всегда есть риск потери данных в случае сбоя приложения.
Решение Вопроса

ую реализацию.

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

Редактировать: Как выясняется, NSUserDefaults "потокобезопасность", кажется, происходит от выполнения операций в основном потоке. Это вызвало серьезный пропуск кадров в одном из моих приложений; Я закончил тем, что разорвал NSUserDefaults и заменил его на поточно-безопасный NSMutableDictionary, который сериализован в файл.

 lorean14 нояб. 2011 г., 17:32
Смотрите раздел "Словари информации о пользователе"developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/... Вы можете сериализовать NSDictionary как NSData. Таким образом, вы можете сохранить NSDictionary как атрибут объекта.developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/... Вы можете создать иерархическую базу данных, просто определив сущности и отношения, в которых сущность корневого уровня не имеет родителя.
 Cbas08 февр. 2016 г., 20:15
Хотелось бы, чтобы я голосовал больше раз - мое приложение изредка зависало от случайных зависаний в течение нескольких недель, и теперь решение очевидно! Как именно это "потокобезопасно", если хранение данных блокирует основной поток ?? очень вводит в заблуждение
 SEG12 нояб. 2011 г., 17:06
Могу ли я использовать базовые данные в качестве словаря, как я могу с NSUserDefaults? Как в хранении значений для ключей? Честно говоря, я не знаю много о Core Data. Возможно ли, чтобы сохраненные данные были иерархической базой данных, подобной спискам? Есть ли хорошие уроки, как сохранить некоторые данные таким образом?

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

Между тем с NSUserDefaults, вы должны всегда использовать методы доступа значения ключа, используя строки для ключа.

т.е .:

myGlobalSettingsObject.lastLoginTime = @(now);

против

[[NSUserDefaults standardUserDefaults] setValue:@(now) forKey:@"lastLoginTime"];

Что, если вы случайно сделаете опечатку при установке ключа где-нибудь? Компилятор не предупредит вас. Что если кто-то вставит не тот тип? Компилятор не предупредит вас.

Например.:

[[NSUserDefaults standardUserDefaults] setValue:@"now" forKey:@"lastLoginTiem"]; ^ ^ ^^^^

... не вызовет ни предупреждения, ни ошибки во время сборки ... опасно!

Другие преимущества использования NSManagedObject заключаются в том, что он может иметь проверку; он может обеспечить ненулевые значения; у него могут быть собственные методы получения и установки, которые вы можете использовать для выполнения некоторых интересных вещей; он может обрабатывать автоматическую миграцию, если вы что-то измените в том, как хранятся все значения; и его модель данных становится частью вашего хранилища, так что вы можете легко отслеживать историю изменений в нем.

Между тем, NSUserDefaults быстр и грязен, и отлично подходит для простых небольших приложений, но это просто очень просто. Хорошо для небольшого приложения, но если у вас огромное приложение, им будет трудно управлять по сравнению с использованием Core Data.

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

над которым я сейчас работаю, мне нужно создать большую базу данных (около 400 000 записей). Если вы используете NSUserDefaults, вы должны добавить записи, которые могут занять до нескольких минут (в зависимости от устройства и способа импорта данных). Если вы используете CoreData, вы можете просто скопировать предварительно созданную базу данных в каталог документов вашего приложения и использовать ее немедленно.

Вот почему я полагаюсь на CoreData.

Ваш ответ на вопрос