Introducció a SQLite
SQLite és una biblioteca de programari que proporciona un sistema de gestió de bases de dades relacional. És lleugera, autònoma i no necessita un servidor separat per funcionar, cosa que la fa ideal per a aplicacions mòbils com les desenvolupades amb Flutter.
Característiques de SQLite
- Lleugera: No requereix configuració ni administració de servidor.
- Autònoma: Tot el que necessita està contingut en una única biblioteca.
- Transaccional: Suporta transaccions ACID (Atomicitat, Consistència, Aïllament, Durabilitat).
- Integrada: Es pot integrar fàcilment en aplicacions mòbils.
Configuració de SQLite en Flutter
Pas 1: Afegir Dependències
Per utilitzar SQLite en una aplicació Flutter, necessitem afegir les dependències sqflite i path al fitxer pubspec.yaml.
Pas 2: Importar les Biblioteques Necessàries
Pas 3: Crear i Obrir la Base de Dades
Future<Database> openDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, 'my_database.db');
return openDatabase(
path,
onCreate: (db, version) {
return db.execute(
"CREATE TABLE items(id INTEGER PRIMARY KEY, name TEXT, value INTEGER)",
);
},
version: 1,
);
}Explicació del Codi
- getDatabasesPath(): Obté el camí del directori on es guardaran les bases de dades.
- join(): Uneix el camí del directori amb el nom del fitxer de la base de dades.
- openDatabase(): Obre la base de dades i executa la funció
onCreatesi la base de dades no existeix.
Operacions CRUD (Crear, Llegir, Actualitzar, Esborrar)
Crear (Insertar)
Future<void> insertItem(Database db, Item item) async {
await db.insert(
'items',
item.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}Llegir (Consultar)
Future<List<Item>> items(Database db) async {
final List<Map<String, dynamic>> maps = await db.query('items');
return List.generate(maps.length, (i) {
return Item(
id: maps[i]['id'],
name: maps[i]['name'],
value: maps[i]['value'],
);
});
}Actualitzar
Future<void> updateItem(Database db, Item item) async {
await db.update(
'items',
item.toMap(),
where: "id = ?",
whereArgs: [item.id],
);
}Esborrar
Future<void> deleteItem(Database db, int id) async {
await db.delete(
'items',
where: "id = ?",
whereArgs: [id],
);
}Explicació del Codi
- insert(): Insereix un nou registre a la taula.
- query(): Consulta tots els registres de la taula.
- update(): Actualitza un registre existent.
- delete(): Esborra un registre de la taula.
Exemple Complet
class Item {
final int id;
final String name;
final int value;
Item({required this.id, required this.name, required this.value});
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'value': value,
};
}
}
void main() async {
final database = await openDatabase();
var item = Item(id: 0, name: 'Item 1', value: 100);
await insertItem(database, item);
print(await items(database));
item = Item(id: 0, name: 'Updated Item', value: 200);
await updateItem(database, item);
print(await items(database));
await deleteItem(database, item.id);
print(await items(database));
}Exercicis Pràctics
Exercici 1: Crear una Taula Nova
Crea una taula nova anomenada users amb les columnes id, username i password.
Exercici 2: Insertar i Consultar
Insereix un nou usuari a la taula users i consulta tots els usuaris.
Exercici 3: Actualitzar un Usuari
Actualitza el nom d'usuari d'un registre existent a la taula users.
Exercici 4: Esborrar un Usuari
Esborra un usuari de la taula users basant-te en el seu id.
Solucions
Solució Exercici 1
Solució Exercici 2
Future<void> insertUser(Database db, User user) async {
await db.insert(
'users',
user.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<User>> users(Database db) async {
final List<Map<String, dynamic>> maps = await db.query('users');
return List.generate(maps.length, (i) {
return User(
id: maps[i]['id'],
username: maps[i]['username'],
password: maps[i]['password'],
);
});
}Solució Exercici 3
Future<void> updateUser(Database db, User user) async {
await db.update(
'users',
user.toMap(),
where: "id = ?",
whereArgs: [user.id],
);
}Solució Exercici 4
Future<void> deleteUser(Database db, int id) async {
await db.delete(
'users',
where: "id = ?",
whereArgs: [id],
);
}Conclusió
En aquesta secció, hem après a configurar i utilitzar SQLite en una aplicació Flutter. Hem cobert les operacions bàsiques de CRUD i hem proporcionat exercicis pràctics per reforçar els conceptes apresos. SQLite és una eina poderosa per gestionar dades localment en aplicacions mòbils, i la seva integració amb Flutter és senzilla i eficient.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació
