#iphone #core-data #persistent-storage
#iPhone #core-data #постоянное хранилище
Вопрос:
спасибо за помощь.
Я пытаюсь добавить core data в свой проект, и я застрял на том, где и как добавить фактические данные в постоянное хранилище (я предполагаю, что это место для необработанных данных).
У меня будет 1000 < объектов, поэтому я не хочу использовать подход plist. Судя по моим поисковым запросам, существуют подходы xml и csv. Есть ли способ, которым я могу использовать SQL для ввода?
Данные не будут изменены пользователем, и файл данных будет введен вручную, поэтому мне не нужно будет обновлять эти файлы во время выполнения, и на данный момент я не ограничен ни в одном типе файла — предпочтителен самый легкий синтаксис.
Еще раз спасибо за любую помощь.
Ответ №1:
Вы могли бы загрузить свои данные из файла xml / csv / json и создать базу данных на первом обеде вашего приложения (если базы данных там нет, тогда прочитайте данные и создайте их). Лучшим / более быстрым подходом может быть отправка вашей базы данных sqllite в ваше приложение. Вы можете проанализировать файл в любом формате, который вы хотите в симуляторе, создать базу данных со всеми вашими объектами, затем взять ее из ApplicationData и просто добавить в свое приложение в качестве ресурса.
Комментарии:
1. Спасибо. У меня еще нет никаких данных на месте, но я очень хорошо знаком с SQL. Я подумал, что было бы лучше создать базу данных и отправить ее, как вы предлагаете, но @vicvicvic предлагает иначе. На данный момент я не привязан ни к какому формату данных, поэтому, возможно, я посмотрю на json.
2. Пожалуйста, посмотрите мой комментарий к ответу @vicvicvic.
Ответ №2:
Хотя я уверен, что можно использовать более легкие типы файлов, я бы включил файл JSON в пакет приложений, из которого вы импортируете исходный набор данных.
Обновление: некоторые люди рекомендуют XML. NSXMLParser работает почти так же быстро, как JSONKit (но намного быстрее, чем большинство других анализаторов), но синтаксис XML тяжелее, чем JSON. Таким образом, XML-файл, содержащий исходный набор данных, будет иметь больший вес, чем если бы он был в формате JSON.
Комментарии:
1. Хорошо, спасибо. Я рассмотрю, что включает в себя создание файла JSON. Говоря об импорте исходного набора данных, находится ли он в этом коде: NSURL *storeUrl = [NSURL fileURLWithPath: [[каталог self applicationDocumentsDirectory]stringByAppendingPathComponent: @»<xcdatamodel_name>.sqlite»]]; ?
2. У вас есть рекомендации по синтаксическим анализаторам? В нижней части этой страницы предлагается краткий список: json.org
3. Известно, чтоJSONKit самый быстрый, но TouchJSON , вероятно, самый распространенный. Оба содержат документацию, которая покажет вам, как преобразовать ваш файл json в NSObjects, который затем можно сохранить в CoreData.
Ответ №3:
Учитывая, что Apple учитывает формат своих постоянных хранилищ, отправка готовой базы данных SQLite — не очень хорошая идея. Т.Е. названия полей и таблиц могут меняться в зависимости от версий iOS / телефонов / любой скрытой переменной, о которой вы можете подумать. В общем, вам не следует беспокоиться о том, как форматируется эта сериализация ваших данных.
На сайте разработчика Apple есть краткая статья об импорте данных: Эффективный импорт данных
Вы должны отправлять исходные данные в любом удобном для вас формате (XML позволяет эффективно выполнять инкрементный синтаксический анализ, что сокращает объем памяти) и написать процедуру импорта для запуска, если вам нужно импортировать данные.
Редактировать: Учитывая комментарий Элибада, я все еще считаю этот подход немного «сомнительным»… Формат базы данных SQLite, используемый Core Data, — это не то, что вы хотели бы создать самостоятельно (проще говоря, это странно, и все же не то, на что вам действительно следует полагаться).
Итак, вы хотели бы использовать макет приложения, работающего на симуляторе, и использовать Core Data для создания базы данных (согласно ответу Элибуда). Но вам все равно придется импортировать данные в это макет-приложение! И хотя, возможно, имеет смысл сделать это один раз на «реальном» компьютере, а не много раз на мобильном устройстве (т. Е. Скопировать файл легко, импортировать данные сложно), по сути, вы используете симулятор как инструмент администрирования.
Но, эй, если это сработает…
Комментарии:
1. Я не планирую получать какие-либо данные из онлайн-источников, и мне нужно ввести сотни записей, вы по-прежнему считаете, что XML — лучший выбор? Из примеров XML, которые я видел, данные окружены большим количеством синтаксиса, что кажется ненужной дополнительной работой — если только мне не понадобится синтаксический анализ?
2. Просматривая тот же документ, в последнем разделе (FAQ), говорится: «Существует несколько способов создания данных. Вы можете создать отдельное постоянное хранилище, содержащее данные по умолчанию, и включить хранилище в качестве ресурса приложения. Когда вы хотите его использовать, вы должны либо скопировать все хранилище в подходящее место, либо скопировать объекты из хранилища по умолчанию в существующее хранилище.» Из этого я прочитал, что можно отправлять базу данных в качестве ресурса, я что-то упускаю?
3. @EliBud: Да, ты совершенно прав… Признаюсь, я не читал этот раздел и весьма удивлен. Итак, я полагаю… все в порядке?
4. @Ernest: Плюсы: XML может быть очень эффективно проанализирован в iOS, и это высоко стандартизированный формат. Смотрите: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… Я ценю, что он основан на потоке и встроен (добавление внешних библиотек в iOS может быть немного затруднительным ). Но да, это очень многословно. Вы собираетесь создавать исходные данные вручную?
5. Да, я должен их ввести. Они не будут удалены ниоткуда. Я заглянул в файл JSON — поскольку я никогда не слышал о нем раньше — и он кажется довольно привлекательным, тем более что мое образование связано с Java. Единственный недостаток, который я вижу, заключается в том, хочу ли я использовать универсальность онлайн-контента. Итак, на этом этапе я решил попробовать файл JSON, который я создал крошечный для тестирования. Моя проблема в том, как получить этот файл в CoreData? У меня есть все шаблонные методы в делегате, должен ли я включать имя моего файла в этот метод? — (NSPersistentStoreCoordinator )persistentStoreCoordinator, как NSURL