¿Relación débil entre tiendas con las properties de Fetched?

Me gustaría separar mis datos de reference de mis datos de usuario en mi model de datos básicos para simplificar futuras actualizaciones de mi aplicación (y porque planeo almacenar la database en la nube y no hay necesidad de almacenar datos de reference en la nube como esto es parte de mi request). Por lo tanto, he estado buscando un time para una forma de codificar una relación entre tiendas utilizando properties buscadas. No he encontrado implementaciones de ejemplo de esto.

Tengo un model Core Data que usa 2 configuraciones:

  • configuration de model de datos 1: UserData (entidades relativas al usuario)

  • model de datos config 2: ReferenceData (entidades relativas a la aplicación en sí)

Configuré 2 almacenes persistentes SQLite diferentes para ambas configuraciones.

  • UserData config (y store) contiene la entidad "User"

  • ReferenceData config (y store) contiene entidades "Type" y "Item".

Me gustaría crear dos relaciones débiles unidireccionales como a continuación:

  • Un "Usuario" tiene un "Tipo" único

  • Un "Usuario" tiene muchos "Elementos"

Estas son mis preguntas:

  • ¿Cómo configuro mis properties?

  • ¿Necesito 2 properties para cada relación (una para almacenar identificación única y otra para acceder a mis resultados buscados)?

  • ¿Podría orderarse esta débil relación?

  • ¿Podría alguien darme una implementación ejemplar de esto?

Como continuación de la respuesta de Marcus:

Mirando a través de los foros y documentos, leí que debería usar la Representación de URI de mi instancia de entidad en lugar de objectID. Cuál es la razón detrás de esto?

// Get the URI of my object to reference NSURL * uriObjectB [[myObjectB objectID] URIRepresentation]; 

A continuación, me pregunto, ¿cómo almaceno mi object URI B (NSURL) en mi object padre A como una relación débil? ¿Qué tipo de atributo debo usar? ¿Cómo puedo convertir esto? ¿Escuché sobre el file …?

Luego, más tarde debería recuperar el object gestionado de la misma manera (por unconvert / unarchive the URIRepresentation) y get Object from URI

 // Get the Object ID from the URI NSManagedObjectID* idObjectB = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]]; // Get the Managed Object for the idOjectB ... 

Y por último, pero no less importante, ¿debo declarar dos properties en mi entidad A, una para persistir en las necesidades de URI y otra para recuperar el object B direccional?

 NSURL * uriObjectB [objectA uriObjectB]; ObjectB * myObjectB = [objectA objectB]; 

¡Como puedes leer, realmente extraño un ejemplo simple para implementar estas relaciones débiles! Realmente agradecería un poco de ayuda.

Dividir los datos es la respuesta correcta de lejos. Los datos de reference no deben sincronizarse con la nube, especialmente dado que iCloud tiene soft caps en lo que permitirá que una aplicación se sincronice y almacene en documentos.

Para crear references blandas en todas las tiendas (no es necesario que sean SQLite, pero es una buena idea para el performance general de la aplicación), necesitará tener algún tipo de key única a la que se pueda hacer reference desde el otro lado; una buena key foránea pasada de moda.

Desde allí puede crear una propiedad buscada en el model para hacer reference a la entidad.

Si bien esta relación no se puede orderar directamente, puede crear un order a través de un índice de sorting o si tiene una sorting lógica, entonces puede orderarla una vez que recupere los datos (uso methods de conveniencia para esto que devuelven una matriz orderada en lugar de un set).

Puedo build un ejemplo pero realmente estás en el path correcto. La única parte divertida es la migration. Cuando detecta una situación de migration, tendrá que migrar cada tienda de forma independiente antes de build su stack de datos principales. Suena complicado, pero realmente no es tan difícil de lograr.

Ejemplo

Imagine que tiene una entidad UserBar en la tienda de usuario y una entidad RefBar en la tienda de reference. El RefBar tendrá entonces una "relación" ObtenidaPropiedad con un UserBar, creando así una relación ToOne.

 UserBar ---------- refBarID : NSInteger RefBar -------- identifier : NSInteger 

A continuación, puede crear una propiedad recuperada en la entidad RefBar en el modelador con un pnetworkingicado de:

$ FETCHED_PROPERTY.refBarID == identificador

Permite el nombre del pnetworkingicado "userBarFetched"

Ahora eso devolverá una matriz, por lo que queremos agregar un método de conveniencia al RefBar

 @class UserBar; @interface RefBar : NSManagedObject - (UserBar*)userBar; @end @implementation RefBar - (UserBar*)userBar { NSArray *fetched = [self valueForKey:@"userBarFetched"]; return [fetched lastObject]; } @end 

Para crear una ToMany es lo mismo, excepto que su método de conveniencia devolvería una matriz y usted orderaría la matriz antes de devolverla.

Como mencionó Heath Borders , es posible agregar una sorting a NSFetchedProperty si lo desea, pero debe hacerlo en código. Personalmente, siempre me ha resultado inútil y no uso esa function. Podría ser más útil si pudiera establecer el order en el modelador.

Usando el ID del object

No recomiendo usar ObjectID o la representación de URIR. El ObjectID (y, por lo tanto, la Representación URIR de ese ObjectID) puede y va a cambiar. Cada vez que migra una database, ese valor cambiará. Está mucho mejor crear un GUID que no cambie.

La relación débil

Solo necesita un solo valor en el lado M de la relación y que almacena el identificador foráneo. En su subclass de objects, solo necesita implementar accesores que recuperen el object (u objects).

Iría con una sola tienda.

Para almacenar cosas en la nube, de todos modos tendrá que serializar los datos, ya sea como sentencias JSON o SQL, o cualquier esquema que prefiera.

Necesitará una copy local de los datos en el dispositivo del usuario, para que pueda acceder a él rápidamente y sin connection. El almacén de la nube solo puede tener la entidad de usuario, mientras que la tienda local (parte de la aplicación) también puede tener la entidad de reference.

Tengo un proyecto similar con una gran tienda de reference (20000 loggings) con información geográfica y contenido generado por los usuarios ("publicaciones"). Yo uso una sola tienda Cuando envío la aplicación, la entidad "publicaciones" también se define pero está vacía. Cuando actualizo el model de datos simplemente vuelvo a generar toda la tienda de reference antes del envío.

No veo absolutamente ninguna razón para ir a una solución cross store aquí.

    Intereting Posts