es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aplicación de Flutter para escritorio (MacOS) – No se encuentra la base de datos SQLITE y se crea una base de datos vacía en el directorio MacOS /Usuarios//Documentos.

Hay algunos problemas muy extraños cuando se utiliza Flutter para aplicaciones de MacOs.

Estoy utilizando la siguiente inicialización de base de datos:

 _initDatabase() async {
Directory dbDirectory = await getApplicationDocumentsDirectory();
String path = join(dbDirectory.path, _databaseName);
//ByteData data = await rootBundle.load("assets/mydatabase.sqlite");
//List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
//await File(path).writeAsBytes(bytes);
return await openDatabase(path,
    version: _databaseVersion,
    //onCreate: _onCreate
    );}

¿Cuál es el problema?

Sigo obteniendo un error que no puede encontrar la tabla. La tabla definitivamente existe.
Pero luego revisé los registros y parece que está utilizando /Users/minombre/Documents para almacenar el archivo de base de datos.

Eso no es lo que quiero. El archivo de base de datos para esta aplicación está en la carpeta de activos y debe permanecer (cuando se empaqueta) dentro del paquete de la aplicación.

¿Cómo especifico la carpeta de activos?
¿Qué estoy haciendo mal?

La función de creación, por cierto, tampoco está funcionando.

Future _onCreate(Database db, int version) async {
await db.execute('''
      CREATE TABLE $table (
        $columnId INTEGER PRIMARY KEY,
        $col1 TEXT,
        $col2 TEXT,
        $col3 TEXT
      )
      ''');}

Estoy exhausto de intentarlo…

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que el archivo de base de datos se está guardando en el directorio incorrecto y no en la carpeta de activos como se pretendía. Para especificar la carpeta de activos, puedes usar el método load del objeto rootBundle para cargar el archivo como un objeto ByteData y luego usar el método writeAsBytes del objeto File para escribirlo en el directorio deseado.

    Aquí tienes un ejemplo:

    _initDatabase() async {
      // Cargar archivo de base de datos como ByteData
      ByteData data = await rootBundle.load('activos/mydatabase.sqlite');
      // Obtener el directorio de documentos de la aplicación
      Directory dbDirectory = await getApplicationDocumentsDirectory();
      // Definir la ruta para guardar el archivo de base de datos
      String path = join(dbDirectory.path, _nombreBaseDatos);
      // Escribir ByteData en la ruta
      await File(path).writeAsBytes(data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));
      // Abrir la base de datos
      return await openDatabase(
        path,
        version: _versionBaseDatos,
        onCreate: _onCreate,
      );
    }
    

    En cuanto a la función onCreate que no funciona, es difícil decirlo sin más información. Una cosa que debes verificar es que el nombre de la tabla y los nombres de columna coincidan con lo que definiste en tu declaración SQL. También es possible que haya un problema con el SQL en sí, por lo que puedes intentar ejecutarlo directamente contra la base de datos para ver si hay algún error.

Comments are closed.