El error de datos básicos se refiere al atributo inexistente de datos centrales de la relación reflexiva de muchos a muchos

Estoy experimentando un error de Core Data desconcertante, en el que recibo el siguiente post de error al intentar save algunos datos:

CoreData: error: (1) I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE' Core Data: annotation: -executeRequest: encountenetworking exception = I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE' with userInfo = { NSFilePath = "/var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite"; NSSQLiteErrorDomain = 1; } 

Para algún context: no hay columna "reflexiva" en mi model de datos. Tengo una entidad, Cards, que tiene un atributo, relatedCards, que es una relación de muchos a muchos entre los elementos de la tarjeta. Estoy bastante confundido acerca de a qué se refiere este error, y cualquier ayuda sería muy apreciada.


ACTUALIZAR

Según una gran sugerencia en los comentarios, ejecuté la aplicación en el simulador de iOS con el argumento -com.apple.CoreData.SQLDebug 3 y recibí la siguiente respuesta:

 CoreData: annotation: Connecting to sqlite database file at "/Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite" CoreData: sql: pragma cache_size=200 CoreData: sql: BEGIN EXCLUSIVE CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ? CoreData: details: SQLite bind[0] = "338478797.092588" CoreData: details: SQLite bind[1] = (int64)7 CoreData: details: SQLite bind[2] = (int64)119 CoreData: details: SQLite bind[3] = (int64)6 CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ? CoreData: details: SQLite bind[0] = "338478797.092577" CoreData: details: SQLite bind[1] = (int64)7 CoreData: details: SQLite bind[2] = (int64)100 CoreData: details: SQLite bind[3] = (int64)6 CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0) CoreData: annotation: Disconnecting from sqlite database due to an error. CoreData: error: (1) I/O error for database at /Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite. SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE' [Switching to process 45402 thread 0x15503] 

Para un pequeño context, he modificado la tabla de la tarjeta para realizar un seguimiento de cuándo se modifica. Eso es lo que está sucediendo en la parte superior de la salida de debugging. Sin embargo, la línea de key en la salida de debugging es claramente la cuarta desde la parte inferior:

 CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0) 

Entré en mi database SQLite y comprobé, no hay una columna FOK_REFLEXIVE en esta tabla. El esquema para esta tabla es:

 CREATE TABLE Z_1RELATEDCARDS ( Z_1RELATEDCARDS INTEGER, REFLEXIVE INTEGER, PRIMARY KEY (Z_1RELATEDCARDS, REFLEXIVE) ); 

Tan claramente, Core Data está tratando de insert datos en un campo que no existe. ¿Qué se supone que debo hacer con esto?

Actualizar:

Este es también un problema informado por los usuarios. No puedo actualizar mi aplicación y solo les digo a los usuarios "oh, bueno, tienes que deshacerte de tu almacén de datos y comenzar de nuevo". Eso no pasará muy bien por desgracia, incluso si fuera la causa de este error.

[Actualización: Según los comentarios de los autores a esta respuesta, esta no es la causa. El problema afecta a los usos finales y no modifica el file sqlite. Dejaré esta respuesta aquí solo para reference futura. –TechZen ]

El reflex aquí es probablemente una unión reflexiva en SQL (también llamada unión automática). El REFLEXIVE en la salida SQLDebug es probablemente el command para crear una tabla de unión o una construcción similar. En este caso, su entidad de Tarjeta probablemente tenga una relación consigo misma. Core Data utiliza una relación sql reflexiva para persistir esa relación de entidad.

Tu dices eso:

He modificado la tabla de la tarjeta para realizar un seguimiento de cuándo se modifica …

… de lo que supongo que has modificado el file de tienda sqlite directamente. Eso generalmente causa problemas, incluida la corrupción. Core Data usa un esquema sql propietario que no está documentado. Cualquier cambio en el mismo o incluso el time de ejecución sqllite puede causar problemas.

Creo que el problema más probable es que el file de la tienda esté corrupto. Raramente obtienes errores de SQL del código objective de Core Data y cuando lo haces, casi siempre está relacionado con un pnetworkingicado que SQL no puede ejecutar.

Comience de nuevo con una versión limpia de su database sin ningún tipo de retoques y vea si funciona.

Acabo de encontrar este problema también. Es un problema para usted y sus clientes. Mucho más si tu aplicación está en el mercado.

Parece haber un problema con la forma en que los datos de núcleo alias varias relaciones de muchos a muchos contenidos en una sola entidad. Mire ESTE POST y ESTE TAN BUENO .

La solución informada en el primer hyperlink no resolvió mi problema. Para mitigar, hice una entidad de contenedor para permitir que mis muchos a muchos parezcan muchos a uno. Pero, si nuestra aplicación ya está en el mercado, necesitaría migrar para mantener los datos del usuario.

Parece que estás recibiendo tu exception al principio. Si este no es el caso, considere filtrar en memory si está fallando en un pnetworkingicado, y no está recibiendo la exception en la mayoría de las entidades raíz.

También parece que esto solo es un problema a veces. Tengo varias entidades que contienen múltiples relaciones de muchos a muchos. Hubo solo una entidad que tuvo este problema. La entidad problemática tenía dos relaciones de muchos a muchos y una relación de uno a uno; todos los cuales fueron opcionales. La regla de eliminación de uno a uno fue cascada, ambos to-many's: anular.

Otra entidad que no causa este problema tiene relaciones:

  • 1 relación de uno a varios, opcional, cascada
  • Relaciones 2 a uno, opcional, cascada
  • 3 relaciones de muchos a muchos, opcionales, anular

¿¿¿Cual es la diferencia??? No estoy seguro. Me siento tentado a crear contenedores de entidades para estos muchos a muchos también para evitar su problema.

Creo que esto es un problema debido al antiguo file .sqlite,

debe eliminar el anterior restableciendo el dispositivo o el simulador.