Closed Frozen-Burrito closed 2 years ago
Un posible problema que contribuya a esto puede ser la inconsistencia entre la definición y la implementación de SQLiteDb.insert()
:
En su comentario de documentación se menciona:
/// Inserta un [SQLiteModel] en la base de datos.
///
/// Retorna el ID de la entidad insertada.
Mientras que en su implementación, el verdadero valor retornado es el número total de registros modificados:
// Insertar la entidad principal.
final insertedId = await db.insert(entity.table, simpleEntityColumns);
if (insertedId >= 0) {
// Incrementar filas modificadas.
totalRowsAltered++;
// Manejar las relaciones muchos a muchos y uno a muchos de la entidad.
totalRowsAltered += await _describeRelationships(entity, insertedId: insertedId);
}
return totalRowsAltered;
Esto posiblemente ha resultado en un uso inconsistente del método en la app.
Además, al probar este código, se encontró que al insertar un perfil de usuario vacío (como resultado de presionar el botón "omitir" en el formulario inicial) el valor de totalRowsAltered
es 3
.
Esto es un valor sospechoso, ya que en teoría solo dos registros deberían ser alterados:
entornos_perfil
.Puede no ser un valor incorrecto, pero es necesario revisar más a fondo.
Se resolvieron los dos problemas identificados en este issue:
SQLiteDb.insert()
ahora retorna el ID de la entidad principal insertada, en vez de la cantidad de registros alterados. Se aclaró su documentación.for (var column in mappedEntity.entries)
en el método SQLiteDb.insert()
. El loop identifica los registros secundarios que deben ser agregados como relaciones muchos a muchos, por lo que se extrajo del loop la sección de código mostrada para que sea invocada una sola vez por invocación de SQLiteDb.insert()
, si es que se identificaron registros secundarios m-m:final requiresMtmOperations = secondaryInsertions.isNotEmpty
|| secondaryDeletions.isNotEmpty;
if (mappedEntity['id'] is int && requiresMtmOperations) {
// Hacer las operaciones necesarias en tablas muchos-a-muchos.
totalRowsAltered += await _modifyManyToMany(
entity.table,
mappedEntity['id'] as int,
otherInsertedRowIds: secondaryInsertions,
otherDeletedRowIds: secondaryDeletions,
);
}
Descripción del Error Cuando el método
SQLiteDB.insert()
crea los registros necesarios para describir una relación muchos a muchos usada por alguna entidad, parece que crea registros duplicados en la tabla muchos a muchos.Cómo Reproducir Pasos para reproducir el error:
perfil
, que se relaciona con variosentornos
)SQLiteDB.insert()
.Comportamiento Esperado El método debería insertar sólo los registros necesarios en la tabla de relación muchos a muchos.
Entorno