Core Data vs SQLite 3 [cerrado]

314

Ya estoy bastante familiarizado con las bases de datos relacionales y he usado SQLite (y otras bases de datos) en el pasado. Sin embargo, Core Data tiene cierto atractivo, por lo que estoy considerando dedicar algo de tiempo para aprenderlo para usarlo en mi próxima aplicación.

¿Hay muchos beneficios al usar Core Data sobre SQLite, o viceversa? ¿Cuáles son los pros / contras de cada uno?

Me resulta difícil justificar el costo de aprender Core Data cuando Apple no lo usa para muchas de sus aplicaciones emblemáticas como Mail.app o iPhoto.app, sino que opto por las bases de datos SQLite. SQLite también se usa ampliamente en el iPhone.

¿Pueden aquellos familiarizados con el uso de ambos comentar sobre su experiencia? ¿Tal vez, como con la mayoría de las cosas, la pregunta es más profunda que simplemente usar una sobre la otra?

Jason Medeiros
fuente
1
¿Podría agregar un enlace a en.wikipedia.org/wiki/Core_Data para que todos no sepan qué es eso?
RSabet
77
¡Tenga en cuenta que Core Data no es y no debe usarse como una base de datos!

Respuestas:

281

Aunque Core Data es un descendiente del Enterprise Object Framework de Apple , un mapeador de objetos relacionales (ORM) que estaba / está estrechamente vinculado a un back-end relacional, Core Data no es un ORM. Es, de hecho, un marco de gestión de gráficos de objetos. Gestiona un gráfico de instancias de objetos potencialmente muy grande, lo que permite que una aplicación funcione con un gráfico que no encajaría por completo en la memoria introduciendo objetos dentro y fuera de la memoria según sea necesario. Core Data también gestiona las restricciones en las propiedades y las relaciones y mantiene la integridad de referencia (por ejemplo, mantener los enlaces hacia adelante y hacia atrás consistentes cuando se agregan / eliminan objetos a / desde una relación). Core Data es, por lo tanto, un marco ideal para construir el componente "modelo" de una arquitectura MVC.

Para llevar a cabo su gestión gráfica, datos básicos sucede a utilizar SQLite como una tienda de discos. Se podría haber llevado a cabo utilizando una base de datos relacional diferente o incluso una base de datos no relacionales, tales como CouchDB . Como otros han señalado, Core Data también puede usar XML o un formato binario o un formato atómico escrito por el usuario como back-end (aunque estas opciones requieren que todo el gráfico del objeto encaje en la memoria). Si está interesado en cómo se implementa Core Data en un backend de SQLite, puede consultar el marco OmniDataObjects de OmniGroup , una implementación de código abierto de un subconjunto de la API de Core Data. El marco BaseTen también es una implementación de la API de Core Data usando PostgreSQL como back-end.

Debido a que Core Data no pretende ser un ORM para SQLite, no puede leer esquemas arbitrarios de SQLite. Por el contrario, no debe confiar en poder leer los almacenes de datos SQLite de Core Data con otras herramientas SQLite; El esquema es un detalle de implementación que puede cambiar.

Por lo tanto, no hay realmente ningún conflicto entre usar Core Data o SQLite directamente. Si desea una base de datos relacional, use SQLite (directamente o mediante uno de los contenedores Objective-C como FMDB ), o un servidor de base de datos relacional. Sin embargo, es posible que desee aprender Core Data para usar como marco de administración de gráficos de objetos. En combinación con las clases de controlador de Apple y los widgets de vista compatibles de enlace de valor clave, puede implementar una arquitectura MVC completa con muy poco código.

Barry Wark
fuente
11
Tenga en cuenta que fmdb no es un ORM, solo un contenedor objc alrededor de sqlite3 C api
robottobor
Gracias por la captura; Actualizaré la publicación.
Barry Wark
3
Excelente respuesta FMDB se mudó a github - github.com/ccgus/fmdb - y es recomendado por un desarrollador de NetNewsWire: inessential.com/2010/02/26/on_switching_away_from_core_data
Chris Dolan
50
Con iOS 5.0 obtienes el beneficio adicional de poder usar la sincronización de archivos de iCloud de forma gratuita si estás usando Core Data. Si está utilizando SQLite directamente, deberá realizar muchos ajustes e implementaciones manuales para que se sincronice en iCloud.
extraño
1
Pruebe www.github.com/pmurphyjam/DBExample Es un proyecto Xcode que usa SQLite.
Pat
46

Y con iOS 5.0 obtienes el beneficio adicional de poder usar la sincronización de archivos de iCloud de forma gratuita si estás usando Core Data. Si está utilizando SQLite directamente, deberá realizar muchos ajustes e implementaciones manuales para que se sincronice en iCloud.

extraño
fuente
77
Nota: iCloud chupa con datos básicos
toasted_flakes
3
Claro que sí, pero dado que es el orgullo y la alegría de Apple, con suerte mejorarán las cosas en las próximas versiones de iOS.
extraño
44
Actualización (después de WWDC 2016): las cababilidades de iCloud de Core Data están en desuso y probablemente serán retiradas en el futuro. Más: mjtsai.com/blog/2016/06/17/the-deprecation-of-icloud-core-data
Nikolay Suvandzhiev
35

Core Data no es tanto un motor de base de datos como una API que abstrae sobre el almacén de datos real. Puede indicarle a Core Data que guarde como una base de datos sqlite, un plist, un archivo binario o incluso un tipo de almacén de datos personalizado.

Recomendaría aprender Core Data, ya que es un excelente recurso que acelera en gran medida muchas partes del desarrollo de aplicaciones de cacao.

Joel Levin
fuente
13

SQLite es uno de los formatos de base de datos para Core Data. Usando Core Data obtienes una mejor integración con el resto de la API de Cocoa.

cefstat
fuente