iOS: как сохранить пользовательский объект, созданный в приложении - PullRequest
2 голосов
/ 04 сентября 2011

Я читал о сохранении объектов, сохранении состояния и т. Д., Но я все еще немного запутался в маршруте, который я должен использовать при сохранении объектов, созданных из моего приложения.Я создал приложение, в котором пользователь может создать радиостанцию ​​с жанром, названием и частотой.Как только пользователь нажимает сохранить, объект «RadioStation» создается с использованием пользовательского класса и сохраняется в массиве NSMutableArray, который помещается в RootViewController.Хотя объекты RadioStation могут храниться в этом массиве и правильно отображаться в табличном представлении, очевидно, что после завершения работы приложения они больше не будут удерживаться приложением.

На данный момент яне уверен, как я должен начать создавать этот дизайн.Нужно ли мне составить список?Должен ли я использовать базовые данные с базой данных SQLite?Нужно ли исследовать сериализацию объектов iOS для обоих этих сценариев?Или есть более прямой путь, о котором я не знаю?

Ответы [ 3 ]

7 голосов
/ 04 сентября 2011

Существует три способа локального сохранения данных:

  1. Сохранение объектов в базе данных с использованием управляемых объектов или SQLite
  2. Сохранение объектов в файле в изолированной программной среде с использованием writeToFile различных классов
  3. Храните данные в NSUserDefaults

То, как вы сохраняете данные вашего объекта, зависит от того, как вы его используете и какой тип данных вы сохраняете.CoreData имеет смысл, если у вас много объектов одного типа, и механизмы поиска и сортировки SQL были бы полезны.Я склонен использовать песочницу для очень больших файлов, например изображений, звуковых файлов и больших скоплений данных, передаваемых через NSData.И я использую UserDefaults для небольших объемов данных, которые могут рассматриваться как «предпочтения».

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

Для вашей RadioStation я бы лично использовал UserDefaults.Преимущество использования NSCoding заключается в том, что после реализации initWithCoder и encodeWithCoder вы можете довольно легко передавать потоковую иерархию объектов (например, массив пользовательских объектов, каждый из которых может содержать словарь, массив или пользовательский объект и т. Д.).Если единственное, что вы сохраняете - это массив строк, то напрямую использовать UserDefaults достаточно просто.

6 голосов
/ 04 сентября 2011

Наиболее эффективный подход - сделать ваш пользовательский объект подклассом NSManagedObject и сохранить его в NSManagedObjectContext с использованием Core Data. В iOS всегда будет использоваться база данных sqlite, в Mac OS X вы можете использовать sqlite, xml или собственный двоичный формат (меньше / быстрее, чем xml).

В зависимости от сложности вашей структуры данных и вероятности ее изменения в будущем, эта методика может быть или не быть слишком сложной для вашего приложения. Настройка очень сложная, а API очень сложный, но это лучший выбор, если вам нужно хранить десятки тысяч / миллионов объектов в файле.

Для вашего приложения у меня был бы один файл sqlite, содержащий все радиостанции в приложении.


Самый простой вариант - реализовать протокол NSCoding в классе вашего пользовательского объекта. Документировано здесь:

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Archiving/Articles/codingobjects.html#//apple_ref/doc/uid/20000948-BCIHBJDE

Основная теория заключается в том, что ваш объект записывает или считывает все свои данные в «кодер», а затем передает кодер любому дочернему объекту (объектам). Вне класса вы используете класс «архиватор» или «unarchiver», чтобы координировать все.

Как только ваш пользовательский класс реализует NSCoding, вы можете читать / записывать его на диск с помощью:

myObject = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
[NSKeyedArchiver archiveRootObject:myObject toFile:filePath];

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

Многие классы в Cocoa / CocoaTouch уже реализуют NSCoding, поэтому их можно записать в файл таким способом (включая NSArray, NSString, NSNumber и т. Д.).

Для вашего приложения я бы использовал это для хранения каждой радиостанции в одном файле. Когда приложение запустится, загрузите все радиостанции из каталога. Вам следует рассмотреть возможность включения функции перетаскивания файлов iTunes для вашего приложения, чтобы пользователи могли легко обмениваться файлами радиостанции со своими друзьями или между устройствами.

Это также хорошо сочетается с iCloud для синхронизации между устройствами, я мало изучал iCloud, но я ожидаю, что один файл на радиостанцию ​​будет идеальным способом для реализации синхронизации iCloud.

0 голосов
/ 04 сентября 2011

Нет необходимости в таких вещах.Если вам нужно сохранить только одну вещь, то исследуйте этот метод NSArray:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag

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

...