Лучший способ сохранить файл XML на iPhone? - PullRequest
3 голосов
/ 17 сентября 2010

Я использую MonoTouch, а также System.Data для создания DataSet (просто xml для незнакомых) для простого связывания данных.Данные в моем приложении минимальны, поэтому нет необходимости полностью использовать SQLLite.Использование набора данных облегчает передачу через веб-службы для облачной синхронизации.

Я сериализирую DataSet в личную папку при сохранении и, конечно же, читаю этот файл при запуске приложения для загрузки данных пользователя.У меня были проблемы с повреждением этого файла, и я не знаю почему.Я предполагаю, что файловый ввод / вывод может быть медленным на этих устройствах, и это может быть причиной, я не уверен, но это происходит.

Я также обеспокоен тем, что, возможно, iTunes передает этот файл обратно ивперед между ПК / MAC, когда пользователь синхронизирует свои устройства с iTunes, что может быть причиной повреждения?

Я хочу предотвратить синхронизацию файла этого устройства с iTunes, а также надежно сохранить его.Я использую NSFile.Save, чтобы сохранить его на устройстве.Я думаю, так как это текстовый файл, может быть, я мог бы более безопасно хранить его в стандартной области пользовательских настроек вместо этого?Я полагаю, это предотвратит синхронизацию с itunes?

Какой самый надежный и безопасный способ обработки этого файла ввода-вывода для хранилища набора данных xml?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 28 сентября 2010

Лучше всего просто сохранить XML в виде текста. Это так же просто, как File.WriteAllText (...) - для этого нет причин идти в NSFile. Это часть преимущества MonoTouch:)

Что касается синхронизации, вот правило:

  • Если вы сохраните файл в папке с документами пользователя (Environment.SpecialFolder.MyDocuments и Environment.SpecialFolder.Personal ОБА указывают на папку с документами пользователя), резервная копия будет создаваться при каждой синхронизации пользователя с iTunes. *

В этом нет ничего плохого. Он сохраняет данные между сеансами и делает их восстанавливаемыми, если с телефоном пользователя что-то пойдет не так, и его нужно восстановить из резервной копии. Поскольку ваш вопрос о сохранении файла XML на телефоне, это то, что вам нужно.

Что касается вопроса iTunes, то здесь нет проблем со скоростью и синхронизацией, потому что ваше приложение не будет работать во время синхронизации телефона. Файл будет либо сохранен, либо нет. Любое повреждение происходит , когда ваше приложение работает .

Причины повреждения файлов могут включать:

  • Не сохраняется до выхода пользователя. У вас есть шанс сделать это.

  • Не изящно обрабатывает входящий телефонный звонок. Система также предупреждает вас об этом.

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

Если вы хотите обучить чтению и записи файлов, я отправил ответ на другой вопрос .

Это долго, но смысл состоял в том, чтобы ответить на столько вопросов, сколько я мог, чтобы никого не оставили в покое или растерянности.

Приятной особенностью iOS-устройств является то, что вы вернулись (для большинства приложений) в мир «один человек за один раз». Вы пишете приложения, в которых вам не нужно беспокоиться о 5000 человек, пытающихся одновременно использовать ваше веб-приложение (это не всегда так, но ... вы понимаете). В результате вы можете делать вещи, которые вы обычно считаете плохими для производительности, но вряд ли вы увидите какие-либо проблемы с производительностью (если файл, который вы сохраняете, либо достаточно мал, чтобы его можно было быстро сохранить, либо вы сохраняете в фоновом режиме в другом потоке - вы никогда не захотите блокировать основной поток (UI) с помощью тяжелой операции ввода-вывода).

Если у вас есть еще вопросы, не стесняйтесь спрашивать.

Надеюсь, это поможет:)

2 голосов
/ 18 сентября 2010

Вы используете MonoTouch.Разве это не просто вопрос вызова DataSet.WriteXml () с объектом FileStream, готовым для записи в документ в папке «Документы»?

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

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

Если запись всего набора данных занимает слишком много времени, вам следует подуматьо минимизации этого.Возможно, вы можете просто хранить данные, а не схему.Или вы можете придумать способ хранения только дельт при выходе и согласования, когда пользователь снова загрузит ваше приложение.

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

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

0 голосов
/ 18 сентября 2010

Рассмотрите возможность использования SQLite, я бы выбрал что-то вроде

  • http://www.taimila.com/entify/ (еще не пробовал)
  • catnap orm
  • или Fakssqlite-net в google-коде (используя это в нескольких приложениях)

entify - если он делает то, что, как он говорит, может - выглядит действительно хорошо.

Сохранение XML на iPhone в качестве средства хранения и доступа к данным - это то, к чему вы не хотите обращаться.Я писал об этом здесь http://iwayneo.blogspot.com/2010/08/festival-star-history-serialization-as.html

0 голосов
/ 18 сентября 2010

Многие фреймворки доступны только для чтения, но я обнаружил, что GDataXMLNode из http://code.google.com/p/gdata-objectivec-client/ очень хорошо работает для чтения / записи.

Сказав это, на iPhone вы бы сделали самибольшая польза от использования Core Data с бэкэндом SQLLite.:-) Apple сделала все это для вас и оптимизировала это больше, чем кто-либо из нас.

Cheers

Nik

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...