2011-09-26 16 views
10

Tengo una aplicación que se conecta a Internet y almacena datos en una base de datos SQL. Probé con iOS4, funciona completamente como debería. Al actualizar a la nueva versión, sin embargo, me sale un NSInternalInconsistencyException, con esto como la razón:'No hay ningún canal de base de datos disponible'

'_obtainOpenChannel - NSSQLCore 0x951a640: no hay un canal de base de datos está disponible'

De lo que he entendido , algo accede a mi base de datos cuando no debería, aunque no puedo entender dónde o por qué.

¿Alguien me puede ayudar a localizar y diagnosticar mi problema correctamente?

+0

¿Encontró el problema finalmente? Lo estoy teniendo ahora también (actualizado a iOs5 ayer ...), y no hay información que se pueda encontrar en absoluto sobre esto. – TheEye

Respuesta

5

he encontrado algo para éste:

Tengo el error (entre algunos otros, viniendo aparentemente al azar) mientras yo estaba accediendo a las relaciones de un objeto administrado en un hilo diferente a la que el contexto logrado fue creado en Ha habido algunos cambios con respecto al acceso concurrente a objetos administrados en iOS5 (ver aquí http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html#//apple_ref/doc/uid/TP40010637) - y aunque el documento indica que el comportamiento predeterminado debe ser anterior a iOS5 aparentemente no es cierto, mi código funcionó sin problemas en iOS4.2.

Por ahora, mi solución consistía en hacer todas las cosillas de acceso a la relación en el hilo principal, almacenar los datos en una matriz y acceder a los datos que necesito en la otra cadena a través de esa matriz. No más errores al menos. Esta no es la solución "agradable", supongo, ya que debería (y lo haré) cambiar la forma en que accedo concurrentemente a los objetos administrados, pero no voy a cambiar eso ahora con prisa.

1

Este tipo de simultaneidad predeterminada para NSManagedObjectContext es NSConfinementConcurrencyType, lo que significa que solo puede usarse con un solo hilo. A partir de la documentación:

Usted promete que el contexto no será utilizada por cualquier tema que no sea el una en la que lo creó.

su lugar, puede crear un contexto de objeto gestionado que está respaldado por una cola privada para uso multiproceso:

[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] 

Para utilizar el contexto de objeto gestionado desde un subproceso diferente, utilice performBlock: (asíncrona) o performBlockAndWait: (sincrónico), por ej.

__block NSArray *results; 
[[self managedObjectContext] performBlockAndWait:^{ 
    results = [[self managedObjectContext] executeFetchRequest:request error:&error]; 
}]; 
// do something with results 

La documentación dice que no necesita usar la API de bloque de la secuencia que creó el contexto del objeto gestionado.

Otra opción es crear contextos de objetos gestionados separados para cada subproceso.

Consulte el iOS 5 release notes para obtener más información.

Cuestiones relacionadas