Contenedor
ModelContainer es el objeto en cargo de administrar la base de datos y almacenar los datos de forma permanente en disco.
Se puede inicializar con el siguiente constructor:
-
ModelContainer.init(for:migrationPlan:configurations:).fores la lista de modelos.migrationplanes el plan de migración de tipoSchemaMigrationPlan, define la evolución del esquema y cómo migrar entre versiones.configurationsson las configuraciones del contenedor de tipoModelConfiguration.
Luego, se puede inyectar a la jerarquía de una vista o escena, por medio de los siguientes modificadores:
También se puede crear el contenedor indirectamente, inyectándolo como variable de ambiente a la jerarquía de una vista o escena con los siguientes modificadores:
Scene.modelContainer(for:inMemory:isAutosaveEnabled:isUndoEnabled:onSetup:)View.modelContainer(for:inMemory:isAutosaveEnabled:isUndoEnabled:onSetup:)
Sea por la aproximación directa o la indirecta, al crear el contenedor basta con pasa un arreglo de los tipos de los modelos de la base de datos.
Configuración del contenedor
En cuanto a la configuración ModelConfiguration
init(isStoredInMemoryOnly:)init(_:schema:isStoredInMemoryOnly:allowsSave:groupContainer:cloudKitDatabase:)
Contexto
La aplicación accede a los datos a través de ModelContext, un objeto que permite extraer, insertar, eliminar modelos y guardar cambios en el disco.
El ModelContext se puede inicializar a partir del ModelContainer con ModelContext.init(_:), o bien se puede acceder al contexto del contenedor por medio de ModelContainer.mainContext.
ModelContext puede manipular el contenedor por medio de los siguientes métodos:
fetch(_:)fetch(_:batchSize:)insert(_:)delete(_:)-
save()- Se debe usarhasChangesprimero para evitar hacer trabajo innecesario. hasChanges-
transaction(block:)- Ejecuta un closure y cuando termina, escribe cambia y elimina sobre el contenedor.
Modelo
El macro Model() convierte una clase (no sirve struct) en un modelo de SwiftData. Al compilarse, el macro hace que la clase conforme PersistentModel y Observable. Se puede conformar PersistentModel, pero de hacerlo, se tienen que definir init(backingData: any BackingData<AnotherModel>), var persistentBackingData: any BackingData<AnotherModel> y static var schemaMetadata: [Schema.PropertyMetadata]; así que es más práctico solo marcar el macro @Model sobre la clase.
Top comments (0)