2011-03-17 8 views
5

Quiero crear una nueva Entidad (tabla) en SQLite. Mi código es el siguiente:Cómo crear dyanmic una nueva entidad (tabla) a través del modelo CoreData?

+(BOOL)CreateDataSet:(NSManagedObjectModel *) model 
    attributes:(NSDictionary*)attributes 
    entityName:(NSString*) entityName 
{ 
    NSEntityDescription *entityDef = [[NSEntityDescription alloc] init]; 

    [entityDef setName:entityName]; 
    [entityDef setManagedObjectClassName:entityName]; 
    [model setEntities:[NSArray arrayWithObject:entityDef]]; 
    NSArray *properties = [CoreDataHelper CreateAttributes:attributes]; 
    [entityDef setProperties:properties]; 

    [entityDef release]; 

    return TRUE; 
} 

Pero lanza errores:

 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Can't modify an immutable model.' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x01c5abe9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x01daf5c2 objc_exception_throw + 47 
    2 CoreData       0x0152634a -[NSManagedObjectModel(_NSInternalMethods) _throwIfNotEditable] + 106 
    3 CoreData       0x01526904 -[NSManagedObjectModel setEntities:] + 36 
.... 

que parece mostrar el modelo es de sólo lectura.

+1

Advertencia: los datos principales no son SQL. Las entidades no son tablas. Los objetos no son filas. Las columnas no son atributos. Core Data es un sistema de gestión de gráficos de objeto que puede o no persistir en el gráfico de objetos y puede o no usar SQL muy detrás de escena para hacerlo. Tratar de pensar en los Datos Básicos en términos de SQL hará que malinterprete completamente los Datos Básicos y resultará en mucho dolor y pérdida de tiempo. – TechZen

Respuesta

2

cito Documentación de Apple que lo describe con mucha precisión:

descripciones de entidad son editables hasta que son utilizados por un gestor gráfico de objetos. Esto le permite crear o modificarlos dinámicamente. Sin embargo, una vez que se usa (cuando el modelo de objeto gestionado al que pertenece está asociado con un coordinador de tienda persistente ), debe no (de hecho no puede) modificarse. Este se aplica en tiempo de ejecución: cualquier intento de mutan un modelo o cualquiera de sus sub-objetos después de que el modelo es asociado con un persistente coordinador tienda provoca una excepción a ser lanzado. Si necesita modificar un modelo que está en uso, cree una copia, modifique la copia y luego deseche los objetos con el modelo anterior.

+0

¿cómo reemplazamos el modelo anterior con el modelo recién creado? –

6

From the documentation: (subrayado es mío)

modelos de objetos gestionados son editables hasta que se utilizan por un gestor gráfico de objetos (un contexto de objeto gestionado o un coordinador almacén persistente). Este le permite crearlos o modificarlos dinámicamente. Sin embargo, una vez que se usa un modelo , no debe cambiarse. Esto se aplica en tiempo de ejecución: cuando el administrador de objetos primero obtiene datos usando un modelo, el conjunto de ese modelo deja de ser editable. Cualquier intento de mutar un modelo o cualquiera de sus sub-objetos después de ese punto provoca una excepción que se lanzará. Si necesita modifique un modelo que esté en uso, cree una copia, modifique la copia, y luego descarte los objetos con el antiguo modelo .

+0

, pero ¿cómo? Intento un nuevo modelo y uso el método NSPersistentStoreCoordinator 'addPersistentStoreWithType: configuration: URL: options: error' guardar el modelo como nuevo archivo sqlite, pero falló ... – iXcoder

2

De la documentación para NSManagedObjectModel:

Edición de modelos mediante programación

modelos de objetos gestionados son editables hasta que se utilizan por un gestor gráfico de objetos (un contexto de objeto gestionado o una coordinador de tienda persistente). Este le permite crearlos o modificarlos dinámicamente.Sin embargo, una vez que se usa un modelo , no debe cambiarse. Esto se aplica en tiempo de ejecución: cuando el administrador de objetos primero obtiene datos usando un modelo, el conjunto de ese modelo deja de ser editable. Cualquier intento de mutar un modelo o cualquiera de sus sub-objetos después de ese punto provoca una excepción que se lanzará. Si necesita modificar un modelo que está en uso, cree una copia, modifique la copia y luego descarte los objetos con el modelo anterior .

En otras palabras, edite su modelo de objeto gestionado antes de configurar su coordinador de tienda persistente o contexto de objeto gestionado.

+0

Hola, ¿sería posible mostrar algún código para este propósito? muchas gracias – iXcoder

0

Ignore CoreData si desea crear entidades dinámicamente, pruebe SQLite (utilice la biblioteca mágica FMDB), no le defraudará.

Tenga en cuenta que SQLite/FMDB no es compatible con iCloud.

Cuestiones relacionadas