SQLite, iCloud и, возможно, Core Data — какие использовать для хранения файлов и обмена ими со всеми устройствами пользователя?

Мне было поручено перенести персональное программное обеспечение для распознавания лиц на iOS и Mac OS X, а также помочь сохранить кроссплатформенный базовый SDK и большую часть программного обеспечения. Одна из вещей, которую один из моих коллег и я хочу сделать, — это хранить данные о лице пользователя в базе данных SQL (возможно, SQLite). Мы также хотели бы позволить пользователям размещать свои данные в iCloud, чтобы им не приходилось обучать каждое из своих устройств в отдельности, чтобы распознавать их. Меня беспокоит то, как выполнять обе эти задачи, и я сталкиваюсь с достаточным выбором, чтобы чувствовать себя подавленным. (Я все еще новичок в некоторых из задействованных технологий.)

Для реализации SQL я мог бы встроить SQLite непосредственно в свою программу и написать для него код, или я мог бы использовать Core Data и заставить его общаться с SQLite для меня. (База данных не предназначена для совместного использования, так что все в порядке. И SQL это не весело.) Однако Core Data совсем не переносима (не говоря уже о том, что она не предназначена для модели, закодированной как объекты C ++), тогда как запись непосредственно для SQL могла бы значит, мы могли бы использовать больше кода на других платформах.

Ситуация усложняется при использовании iCloud, у которого есть пять или шесть возможных способов интеграции с программой. Единственный метод, который я до сих пор окончательно исключил, — это хранилище ключей-значений iCloud. (По крайней мере, есть большая вероятность, что у пользователя возникнут проблемы с лимитом в 1 МБ, и он явно не предназначен для чего-либо столь сложного, как я имею в виду.) Базовые данные могут интегрироваться с iCloud через UIManagedDocument или NSPersistentStore. , но, опять же, это означает меньше в плане многоразового использования кода. Я могу использовать SQLite вместе с UIDocument или NSDocument, но то, что я пытаюсь сделать, похоже, не совсем то, для чего предназначались эти объекты. Файлы, с которыми я имею дело, являются по существу большими файлами предпочтений, не предназначенными для непосредственного взаимодействия с конечными пользователями; UIDocument и NSDocument, кажется, предназначены для файлов, которые можно просматривать и редактировать. И еще есть iCloud Drive и CloudKit, которые все еще находятся в бета-версии. (С другой стороны, эти два должны быть выпущены довольно скоро. Учитывая, что пользователи iOS имеют тенденцию быстро обновляться до последней версии системного программного обеспечения, аргументы об использовании любого из них основаны на том, сколько устройств они смогут запустить он должен быстро стать слабым и устаревшим.)

Кто-нибудь может порекомендовать, какой путь лучше всего подходит для моих целей? Заранее спасибо.

Аарон Соломон Адельман

0

Решение

Во-первых, вы не хотите пытаться делиться файлом SQLite напрямую. Это очень вероятно повредит файл, потому что SQLite не был создан с учетом такого использования.

Тем не мение:

  • Вы можете использовать SQLite только для локального хранения на устройстве и использовать отдельный API для отправки данных туда и обратно. CloudKit от Apple, вероятно, будет хорошим выбором, если вам потребуется iOS 8+. Существуют многочисленные сторонние решения (например, парсить). Вам придется написать собственный код для перевода между SQLite и сетевым API. Ваша схема SQLite и ваши файлы данных будут переносимы на другие платформы, и может быть часть кода, если вы используете прямой API SQLite вместо оболочки Objective-C (и я настоятельно рекомендую использовать либо FMDB или же PLDatabase если вы используете SQLite).
  • Core Data имеет встроенную поддержку iCloud, что, вероятно, делает его жизнеспособным вариантом. Ваш комментарий, который «… Я мог бы использовать Core Data и заставить его общаться с SQLite для меня». предполагает, что вы могли неправильно понять основные данные. Базовые данные не являются оболочкой SQLite; он представляет совершенно другой API и использует свою собственную схему. Вы не можете взять файл постоянного хранилища Core Data и использовать его на других платформах, если не хотите потратить некоторое время на обратную разработку схемы. Кроме того, использование Core Data с iCloud не требует использования UIManagedDocumentхотя это все еще требует много других специфических для Core Data классов.
  • Если вы хотите иметь возможность синхронизировать данные на нескольких устройствах которые не все устройства Apple тогда вам нужен сторонний API. Ни один облачный API Apple не будет здесь полезен. Есть много провайдеров, которые могут помочь с этим. Для локального хранения данных подойдет либо SQLite, либо Core Data, но вы должны посмотреть на сторонние сервисы и посмотреть, какие опции хранения они поддерживают, а затем попытаться работать с ними.

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

2

Другие решения