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.
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']));
}
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:
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter