Usando SQLite en Flutter

- Andrés Cruz

Usando SQLite en Flutter

Los datos persistentes son muy importantes para los usuarios, ya que sería inconveniente para ellos escribir su información cada vez o esperar a que la red cargue los mismos datos nuevamente. En situaciones como esta, sería mejor guardar sus datos localmente. En este artículo, demostraré esto usando SQLite en Flutter.

¿Por qué SQLite?

SQLite es una de las formas más populares de almacenar datos localmente. Para este artículo, usaremos el paquete sqflite para conectarnos con SQLite. Sqflite es uno de los paquetes más utilizados y actualizados para conectarse a bases de datos SQLite en Flutter.

sqflite

1. Agrega dependencias a tu proyecto

En su proyecto, vaya a pubspec.yaml y busque las dependencias. En dependencias, agregue la última versión de sqflite.

dependencies: sqflite: #https://pub.dev/packages/sqflite

2. Cree un cliente de base de datos

Ahora, en su proyecto, cree un nuevo archivo db/operation.dart (o el nombre que dispongas, por ejemplo database.dart). En el archivo recién creado, necesitamos crear un singleton. Por qué necesitamos singleton: utilizamos el patrón singleton para asegurarnos de que SOLO tenemos una instancia de clase y proporcionar un acceso de punto global a ella

1.Configurar la base de datos

A continuación, crearemos el objeto de la base de datos y le proporcionaremos un captador donde crearemos una instancia de la base de datos si no lo es (inicialización diferida).

static Future<Database> _openDB() async {
   return openDatabase(join(await getDatabasesPath(), 'notes.db'),
       onCreate: (db, version) {
     return db.execute(
       "CREATE TABLE notes (id INTEGER PRIMARY KEY, title TEXT, content TEXT)",
     );
   }, version: 1);
 }

2. Cree la clase de modelo

Los datos dentro de su base de datos se convertirán en Dart Maps, por lo que primero debemos crear las clases de modelo con los métodos toMap y fromMap; estos nombres por convención, nos permiten convertir de un objeto a un mapa y viceversa; puedes que necesites implementar uno o los dos según sea el caso, en este caso, nos basta con el de toMap:

 Map<String, dynamic> toMap() {
    return {'id': id, 'title': title, 'content': content};
  }

Y nuestro modelo:

class Note {
  int id;
  String title;
  String content;

  Note({this.id, this.title, this.content});

  Note.empty();

  Map<String, dynamic> toMap() {
    return {'id': id, 'title': title, 'content': content};
  }
}

4. Operaciones CRUD

Crear

El paquete SQFlite proporciona dos formas de manejar estas operaciones usando consultas RawSQL o usando el nombre de la tabla y un mapa que contiene los datos:

Usando rawInsert:

newClient(Note note) async {
Database db = await _openDB();
    var res = await db.rawInsert(
      "INSERT Into notes (id,title)"
      " VALUES (${note.id},${note.name},${note.description})");
    return res;
  }

Usando insert:

static Future<void> insert(Note note) async {
    Database database = await _openDB();

    return database.insert("notes", note.toMap());
  }

Leer

Obtener nota por id

find(int id) async {
    Database db = await _openDB();
    var res =await  db.query("notes", where: "id = ?", whereArgs: [id]);
    return res.isNotEmpty ? Note.fromMap(res.first) : NULL ;
  }

Actualizar un registro existente

static Future<void> update(Note note) async {
    Database database = await _openDB();

    return database.update("notes",note.toMap(), where: 'id = ?', whereArgs: [note.id]);
  }

Eliminar un registro existente

 static Future<void> delete(Note note) async {
    Database database = await _openDB();

    return database.delete("notes", where: 'id = ?', whereArgs: [note.id]);
  }

Obtener todos los registros existentes

static Future<List<Note>> notes() async {
    Database database = await _openDB();

    final List<Map<String, dynamic>> notesMap = await database.query("notes");

    for (var n in notesMap) {
      print("____" + n['title']);
    }

    return List.generate(
        notesMap.length,
        (i) => Note(
            id: notesMap[i]['id'],
            title: notesMap[i]['title'],
            content: notesMap[i]['content']));
  }

Artículo recomendado

Aquí puedes obtener referencia al ejemplo completo: https://github.com/libredesarrollo/flutter-crud

Y puedes ver de manera gratuita como construimos esta aplicación en mi canal de YouTube:

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.