objective c - software - ¿Se pueden usar múltiples(dos) tiendas persistentes con un modelo de objetos, mientras se mantienen las relaciones de una a la otra?
modelo de caso de uso (3)
Introducción
Mi proyecto iOS se envía con una tienda persistente Core Data que pesa unos 160MB en formato SQLite. Hay una tonelada de información agrupada allí, en la que los usuarios deberían poder marcar favoritos. Para esto, necesito (al menos parte de) la base de datos para tener capacidades de escritura. Pero, por supuesto, las tiendas persistentes que se envían en el paquete de aplicaciones son de diseño de solo lectura.
Si desea que la tienda tenga capacidades de lectura y escritura, debe copiarla en, por ejemplo, la carpeta de documentos de la aplicación. No quiero hacer esto, porque entonces la aplicación sería el doble de tamaño, mientras que la parte principal de esa base de datos es de solo lectura de todos modos. Eso sería un desperdicio de recursos.
Varias tiendas persistentes para NSPersistentStoreCoordinator
Es por eso que pensé en usar dos tiendas persistentes. El primero sería el más grande en el paquete, y el segundo podría ser uno pequeño en la carpeta de documentos, almacenando entidades especiales "favoritas" con relaciones con la gran tienda.
Sé que es posible algo en este sentido, pero no puedo encontrar los detalles. ¿Debería uno solo usar múltiples tiendas si también tiene múltiples modelos de objetos? ¿Se puede ''distribuir'' un modelo de objeto sobre dos tiendas persistentes? Al navegar a través de los documentos de Programación de Datos Centrales , no puedo encontrar ninguna referencia real sobre cómo configurar esto. También el libro de Marcus Zarra no parece profundizar en este tema:
Es posible agregar más de un NSPersistentStore al NSPersistentStoreCoordinator, que puede ser útil cuando se trata de datos que se dividen en varios archivos. Sin embargo, en nuestro ejemplo, tenemos un solo archivo. ( Marcus Zarra: "Datos principales - API de Apple para datos persistentes en Mac OS X" página 71 )
La pregunta
¿Quién podría decirme si lo que estoy pensando es posible con Core Data y múltiples tiendas persistentes? ¿Y podría darnos una pista sobre cómo lograr esto? Los recursos en línea / fuera de línea que se ocupan del tema son muy apreciados también.
La respuesta es sí. @Caleb señala los recursos adecuados, pero lograr que funcione es bastante incómodo. Pensé que pondría un currículum aquí:
Para que dos instancias de NSPersistentStore
compartan el mismo modelo, debe agregar una configuración a su modelo, que es un subconjunto con nombre de cadena de las entidades:
En el modelo, a una entidad que pertenece a la segunda tienda, agrega una propiedad recuperada ( NSFetchedPropertyDescription
para googlability). Esto es algo así como un procedimiento almacenado muy simple, y podría verse así:
Luego, cuando agrega las tiendas a su coordinador de tienda persistente, usa las cadenas para el argumento de configuration
(más información sobre las opciones aquí ):
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"ModifyInBackground"
URL:storeURL1
options:options
error:&error]
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"ModifyInMain"
URL:storeURL2
options:options
error:&error]
Finalmente, cuando desee llegar desde la entidad en la tienda B a la entidad en la tienda A, activará la propiedad recuperada como si activara una falla, simplemente accediendo a ella.
Nota: Una propiedad recuperada siempre devuelve un NSArray, porque el predicado que se escribe para establecer el enlace puede tener múltiples resultados. Si desea acceder a una sola entidad, puede colocar algo como esto en un método contenedor de su subclase NSManagedObject
:
Wallpaper *recordedWallpaper = [record.wallpaper lastObject];
Sí, puede usar múltiples tiendas para un solo modelo, pero no puede crear relaciones entre objetos en diferentes tiendas. Busque la sección de Cross Store Relationships en la guía Core Data Programming, que básicamente dice eso y recomienda usar las propiedades obtenidas si necesita relacionar un objeto en una tienda con un objeto en otra.
Un pensamiento: es posible que desee crear diferentes tiendas en total y también diferentes coordinadores de tiendas persistentes para cada una de las tiendas. Y luego crea diferentes contextos de objetos gestionados para cada parte del modelo. Entonces, digamos, tengo un modelo con 3 entidades: estudiante, universidad y cursos. Supongamos que quiero almacenar Entidades estudiantiles y universitarias en la tienda 1, y Curso en Tienda2, tendría 2 conjuntos de managedObjectContext, pesistent store y persistent cordinator. Ahora que no podemos tener relaciones cruzadas, la modificación en un contexto no afecta a otro contexto. No tiene que crear diferentes modelos o asociarlos a las tiendas -etc.