2012-03-05 34 views
19

He estado buscando un artículo que explique las ventajas y desventajas de NSCeading (NSKeyedArchiver ...) sobre el uso de CoreData (SQLite ....).NSCoding VS Core data

Hay muchas opciones, puedo implementar mi propio lector/escritor binario personalizado, o usar plists/xml/json ... o usar SQLite o NSCoding.

Estoy perdido en este momento. ¿Puede algún cuerpo explicar cuál es la diferencia entre las características PRINCIPALES?

+2

Posibles duplicados: http://stackoverflow.com/questions/4989609 http://stackoverflow.com/questions/840634 –

+2

la cosa es sqlite se considera dentro de coredata. Y el primer enlace que sugirió, habla específicamente de sqlite3 vs nscoding; sin muchas respuestas Estoy haciendo preguntas más generales. Por qué hay tantas opciones para tratar con datos. – LolaRun

Respuesta

30

Depende del tipo de datos que desee guardar y si solo lo usará internamente o si tendrá que intercambiar los datos con un servicio externo.

NSCoding es en general un serializador de datos. Una gran cantidad de objetos incorporados implementa el protocolo NSCoder que le permite guardarlos como una secuencia binaria (archivo, en un BLOB de sqlite, etc.). El NSKeyedArchiver le da el plus de búsqueda en tales flujos basados ​​en una etiqueta de cadena , un poco como un diccionario, pero solo puede usar cadenas como claves. Este enfoque es bueno si ocasionalmente tiene que persistir algunos objetos de diferentes clases.

Sin embargo, si usted tiene muchos objetos de la misma clase , usted es mejor ir para una base de datos de enfoque, SQLite o CoreData. CoreData es prácticamente una envoltura alrededor de SQLite que facilita mucho el diseño de su modelo de datos, y hace las consultas al DB detrás de las cortinas, sin la necesidad de escribir sentencias de SQL. En CoreData usted define sus clases, y cada instancia de la clase puede persistir, es decir, puede recuperar los valores de los miembros del objeto sin tenerlos siempre en la memoria. Esta es una forma muy conveniente de almacenar una gran cantidad de datos estructurados. Por ejemplo, si escribe un navegador web, puede almacenar los marcadores del usuario con el nombre, la URL y tal vez la última vez que lo visitó.

Para XML y JSON no hay una ventaja particular si usa los datos solo localmente en el dispositivo. Si tiene que comunicarse con algún servicio externo, puede considerar almacenar en caché/guardar los objetos XML/JSON tal como están para su uso posterior. Otro enfoque sería regenerar estos datos a partir de sus estructuras internas de datos (ver arriba) cada vez que lo necesite.

Si diseña usted mismo su modelo de datos, veo aún menos puntos para usar listas, pero tal vez alguien me corrija.

EDITAR: Agregué aquí una referencia de enlace corto para tutoriales sobre cómo usar NSCoding, Core Data, y como una bonificación, SQLite.

ACTUALIZACIÓN 12.01.2016: Si está buscando soluciones de persistencia, le sugiero que también consulte Realm.

+0

si los archivos blob de un sqlite están serializados, eso podría significar que la serialización es la mejor para obtener los fragmentos más pequeños de datos binarios. También puede usar NSCoding para conditionalObjectEncodings, que elimina la duplicación de instancias de objetos vivos en memoria. La razón por la que hago esta pregunta es porque todo el mundo habla y sugiere Coredata-SQLite, pero no veo esa ventaja a menos que compita contra un gran origen de datos, y no se puede poner todo eso en la memoria. Estoy en lo correcto? – LolaRun

+2

Siempre hay un equilibrio entre la memoria y la optimización del rendimiento. Con NSCoding, o su representación binaria personalizada, tiene mucho más control sobre los bits que se escriben en el almacenamiento o que se almacenan en la memoria, pero para esto tiene que pagar el precio de la codificación, por lo que la eficacia del código dependerá de su habilidades. Con CoreData/SQLite se implementan muchas cosas útiles para usted de una manera eficiente (búsqueda, consultas, indexación, combinaciones, etc.). Nota: los objetos CoreData se cargan en la memoria solo cuando es necesario, de lo contrario permanecen en el db. – MrTJ

+0

Excelente. Entonces, si estoy usando la plantilla de aplicaciones "ApplicationDocument", y si necesito guardar y abrir documentos, realmente no necesitaría los beneficios de CoreData, ya que necesito cargar todo en la memoria, y no necesito consultar y ... funcionalidades de la base de datos. La principal diferencia es el costo de desarrollo. Lo cual en mi caso no es un revés. Muchas gracias. Esperaré un poco, para atraer más respuestas y más discusiones, antes de aceptar una respuesta – LolaRun

3

Siempre hay una impedancia entre los objetos y las estructuras relacionales. Siempre prefiero los objetos, ya que el acceso a los datos suele ser una fracción de la funcionalidad de tu aplicación. Con NSCoding, obtienes simplicidad, facilidad de depuración y control con muy poco código para escribir de todos modos. También tiene la flexibilidad de incorporar NSCoding en sus estructuras de base de datos.

NSCoding es un mecanismo de persistencia para guardar objetos. Si agrega índices a sus estructuras relacionales para optimización de búsqueda y mantiene estructuras de objetos, entonces creo que obtiene lo mejor de todos los mundos a un costo muy bajo y es fácil de mantener.

2

para añadir a ya grandes respuestas, NSCoding junto con NSKeyedArchiver es una gran manera de almacenar datos que es demasiado grande (o tipo de datos incompatible) para NSUserDefaults pero demasiado pequeño y no numeroso para CoreData.