2011-04-01 14 views
18

Esta es la primera vez que tengo datos básicos, y aparece el siguiente error.Datos principales; Error de cacao 134100

Realmente apreciaría si pudieras decirme cómo solucionarlo.

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x5927880 {metadata=<CFBasicHash 0x59269a0 [0x1007400]>{type = immutable dict, count = 7, 
entries => 
    2 : <CFString 0x5926e10 [0x1007400]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x5927240 [0x1007400]>{type = immutable, count = 0, values =()} 
    4 : <CFString 0x5927190 [0x1007400]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x5926ca0 [0x1007400]>{value = +320, type = kCFNumberSInt64Type} 
    6 : <CFString 0x59271c0 [0x1007400]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x5927340 [0x1007400]>{type = immutable dict, count = 2, 
entries => 
    0 : <CFString 0x5927280 [0x1007400]>{contents = "Details"} = <CFData 0x59272f0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x434e180241ecf461e59580e640ff926b ... aa456d1410ed9d1b} 
    2 : <CFString 0x5927260 [0x1007400]>{contents = "History"} = <CFData 0x59272a0 [0x1007400]>{length = 32, capacity = 32, bytes = 0x3437f77a5563363f66b9d72ea76e0ff1 ... be194eb9dd17cddc} 
} 

    7 : <CFString 0xe238b0 [0x1007400]>{contents = "NSStoreUUID"} = <CFString 0x5926fc0 [0x1007400]>{contents = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"} 
    8 : <CFString 0xe23720 [0x1007400]>{contents = "NSStoreType"} = <CFString 0xe238f0 [0x1007400]>{contents = "SQLite"} 
    9 : <CFString 0x59271f0 [0x1007400]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x4d13e20 [0x1007400]>{value = +3, type = kCFNumberSInt32Type} 
    10 : <CFString 0x5927220 [0x1007400]>{contents = "_NSAutoVacuumLevel"} = <CFString 0x5927380 [0x1007400]>{contents = "2"} 
} 
, reason=The model used to open the store is incompatible with the one used to create the store}, { 
    metadata =  { 
     NSPersistenceFrameworkVersion = 320; 
     NSStoreModelVersionHashes =   { 
      Details = <434e1802 41ecf461 e59580e6 40ff926b 20004ce9 58eb965f aa456d14 10ed9d1b>; 
      History = <3437f77a 5563363f 66b9d72e a76e0ff1 ed7f70fd cb7035e9 be194eb9 dd17cddc>; 
     }; 
     NSStoreModelVersionHashesVersion = 3; 
     NSStoreModelVersionIdentifiers =   (
     ); 
     NSStoreType = SQLite; 
     NSStoreUUID = "6C5FECCB-0B64-46EB-809B-E0A4577D1E90"; 
     "_NSAutoVacuumLevel" = 2; 
    }; 
    reason = "The model used to open the store is incompatible with the one used to create the store"; 
} 
sharedlibrary apply-load-rules all 
Current language: auto; currently objective-c 
kill 
quit 
Program ended with exit code: 0 

Mi código está aquí: https://gist.github.com/898579

Respuesta

60

Aquí está la razón:

The model used to open the store is incompatible with the one used to create the store 

Y aquí es cómo lo hizo:

  1. que ha creado algunas entidades con algunos atributos y escribió un código
  2. puso en marcha la aplicación, probablemente añadida algún contenido
  3. salir de la aplicación y ha añadido/cambiado algunos más entidades con atributos
  4. Es probable que puso en marcha la aplicación de nuevo y ahora te está dando el error

La razón de esto se debe a que su nuevo modelo de objeto administrado está tratando de usar una versión anterior de almacenamiento (la primera vez que se creó cuando lanzó la aplicación).

La solución rápida y sucia sería eliminar el archivo de almacenamiento (en algún lugar de ~/Library/Application Support/YOUR_APP /) y volver a iniciar la aplicación.

Para referencia futura: si lanza una aplicación y en la próxima versión la aplicación ha cambiado el modelo de objetos gestionados, debe escribir migraciones para ello. Todo esto y más está cubierto en el libro de cocina de programación de datos básicos en la documentación de Apple.

+2

Estoy trabajando en un equipo de dos: cuando uno de nosotros se instala en el teléfono donde la aplicación ha sido instalada previamente por la otra, obtenemos este error. El modelo/estructura de datos no ha cambiado. ¿Está relacionado con la identidad del usuario que firma la aplicación? – Marc

+0

No lo sé. Podría verse afectado por el GUID de la aplicación. – Eimantas

+0

Impar: estamos usando SVN como control de versiones. Me preocupa que si otro desarrollador se hiciera cargo de la aplicación después de mí, podrían lanzarla a la tienda de aplicaciones con este bloqueo. Mantendré este hilo publicado si descubro por qué está sucediendo. – Marc

14

Debería ser suficiente si quita la aplicación de su simulador/dispositivo.

No tiene que cambiar los archivos en su proyecto (excepto elegir un modelo actual y reemplazar las clases con el menú: Editor/Crear NSProjeto Subclase).

1

Algunas veces debe cargar datos de una tienda creada por otra aplicación, p. una aplicación se usa solo para cargar datos desde una fuente externa y para guardarla en la tienda y la otra aplicación usa esta tienda llena de datos como punto de partida.

No quiero decir que es súper correcto, pero en caso de que lo necesite de vez en cuando durante el desarrollo de la aplicación: simplemente cambie el UUID en la tienda (por SQLVue etc.) a la derecha que es esperado por su aplicación. Encontrará el UUID en la tabla llamado en la mayoría de los casos ZMETADATA en la única columna llamada Z_UUID. Pero recuerde, solo para propósitos rápidos de depuración/desarrollo. No use esto programáticamente.

+0

¿Cómo haré esto programáticamente, p. cuando he copiado un UIManagedDocument y quiero usar su copia? – AlexR

2

Usted debe hacer siguiendo los pasos

  1. eliminar la aplicación y ejecutarla de nuevo, si se sigue mostrando el mismo error. Entonces significa que usaste los atributos/atributos específicos con diferentes tipos.
  2. Vaya a su archivo .xcdatamodeled y compruebe el tipo de cada atributo.
  3. Vaya a su código y verifique, al insertar los atributos/objetos en los datos principales, utilizó el mismo tipo de diferente.Entonces, el punto es type (NSString, NSDate ...) de los atributos/objetos en su código y .xcdatamodeled debería ser el mismo. Si no, entonces se le dará el error "error de dominio = Código NSCocoaErrorDomain = 134100"
1

Si está en el modo de desarrollo y no desea eliminar la aplicación cada vez que cambie las entidades que recomiendan utilizar esta solución :

- (void)removeCoreDataStorage { 
    // Where does the SQLite file go? 
    NSArray *documentDirectories = 
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
             NSUserDomainMask, 
             YES); 
    // Get one and only document directory from that list 
    NSString *documentDirectory = [documentDirectories firstObject]; 
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"]; 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:path]; 

    NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]]; 
    NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]]; 

    BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 
    if (isRemoveItemAtURL == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 

    BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error]; 
    if (isRemoveItemAtURLWal == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 

    BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error]; 
    if (isRemoveItemAtURLShm == NO) { 
     NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason); 
    } 
} 

no se olvide de cambiar el path con su propio camino.

+0

El problema ocurrió después de actualizar iOS de 10.3 a 10.3.2. Esto ayudó a resolver el problema. ¡Gracias! –

Cuestiones relacionadas