La persistència de dades és un aspecte fonamental en el desenvolupament d'aplicacions mòbils. Permet que les aplicacions emmagatzemin dades de manera permanent, de manera que aquestes dades estiguin disponibles fins i tot després de tancar l'aplicació. En aquest tema, explorarem els conceptes bàsics de la persistència de dades en Flutter i les diferents tècniques i eines que podem utilitzar per aconseguir-ho.
Objectius del Tema
- Comprendre què és la persistència de dades.
- Conèixer les diferents opcions d'emmagatzematge disponibles en Flutter.
- Aprendre a decidir quina tècnica d'emmagatzematge utilitzar segons les necessitats de l'aplicació.
Què és la Persistència de Dades?
La persistència de dades es refereix a la capacitat d'una aplicació per emmagatzemar dades de manera que aquestes es mantinguin disponibles fins i tot després de tancar l'aplicació. Això és crucial per a moltes aplicacions que necessiten recordar l'estat de l'usuari, preferències, dades d'usuari, etc.
Tipus d'Emmagatzematge
En Flutter, hi ha diverses opcions per a la persistència de dades:
-
Preferències Compartides (Shared Preferences)
- Ideal per emmagatzemar petites quantitats de dades com configuracions o preferències de l'usuari.
- Utilitza un emmagatzematge clau-valor.
-
Emmagatzematge de Fitxers
- Permet emmagatzemar dades en fitxers al sistema de fitxers del dispositiu.
- Útil per a dades que no encaixen bé en un format clau-valor.
-
Base de Dades SQLite
- Una base de dades relacional que permet emmagatzemar dades estructurades.
- Ideal per a aplicacions que necessiten emmagatzemar i gestionar grans quantitats de dades.
-
Hive
- Una base de dades NoSQL lleugera i ràpida.
- Ideal per a aplicacions que necessiten un emmagatzematge local ràpid i eficient.
Comparació d'Opcions d'Emmagatzematge
Opció | Avantatges | Desavantatges |
---|---|---|
Preferències Compartides | Fàcil d'implementar, ideal per a petites dades clau-valor | No adequat per a dades complexes o grans quantitats de dades |
Emmagatzematge de Fitxers | Flexible, permet emmagatzemar qualsevol tipus de dades | Pot ser més complex de gestionar, no estructurat |
SQLite | Potent, permet emmagatzemar dades estructurades, suport per a consultes SQL | Pot ser excessiu per a petites quantitats de dades |
Hive | Ràpid, lleuger, fàcil d'usar | No relacional, pot no ser adequat per a dades molt complexes |
Exemples Pràctics
Preferències Compartides
import 'package:shared_preferences/shared_preferences.dart'; void savePreference() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('username', 'JohnDoe'); } void loadPreference() async { final prefs = await SharedPreferences.getInstance(); String? username = prefs.getString('username'); print('Username: $username'); }
Emmagatzematge de Fitxers
import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; } Future<File> get _localFile async { final path = await _localPath; return File('$path/data.txt'); } Future<File> writeData(String data) async { final file = await _localFile; return file.writeAsString(data); } Future<String> readData() async { try { final file = await _localFile; return await file.readAsString(); } catch (e) { return 'Error reading data: $e'; } }
SQLite
import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; Future<Database> initializeDB() async { String path = join(await getDatabasesPath(), 'app_database.db'); return openDatabase( path, onCreate: (db, version) { return db.execute( "CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)", ); }, version: 1, ); } Future<void> insertUser(Database db, String name, int age) async { await db.insert( 'users', {'name': name, 'age': age}, conflictAlgorithm: ConflictAlgorithm.replace, ); } Future<List<Map<String, dynamic>>> retrieveUsers(Database db) async { return await db.query('users'); }
Hive
import 'package:hive/hive.dart'; void main() async { await Hive.initFlutter(); var box = await Hive.openBox('myBox'); // Emmagatzemar dades box.put('name', 'John Doe'); // Recuperar dades var name = box.get('name'); print('Name: $name'); }
Exercici Pràctic
Exercici 1: Emmagatzematge de Preferències d'Usuari
- Crea una aplicació Flutter que permeti a l'usuari introduir el seu nom i edat.
- Emmagatzema aquestes dades utilitzant Preferències Compartides.
- Mostra les dades emmagatzemades quan l'usuari torni a obrir l'aplicació.
Solució
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: UserPreferencesPage(), ); } } class UserPreferencesPage extends StatefulWidget { @override _UserPreferencesPageState createState() => _UserPreferencesPageState(); } class _UserPreferencesPageState extends State<UserPreferencesPage> { final TextEditingController _nameController = TextEditingController(); final TextEditingController _ageController = TextEditingController(); @override void initState() { super.initState(); _loadPreferences(); } _loadPreferences() async { final prefs = await SharedPreferences.getInstance(); setState(() { _nameController.text = prefs.getString('name') ?? ''; _ageController.text = prefs.getInt('age')?.toString() ?? ''; }); } _savePreferences() async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('name', _nameController.text); await prefs.setInt('age', int.parse(_ageController.text)); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('User Preferences'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( controller: _nameController, decoration: InputDecoration(labelText: 'Name'), ), TextField( controller: _ageController, decoration: InputDecoration(labelText: 'Age'), keyboardType: TextInputType.number, ), SizedBox(height: 20), ElevatedButton( onPressed: _savePreferences, child: Text('Save Preferences'), ), ], ), ), ); } }
Resum
En aquest tema, hem après què és la persistència de dades i per què és important en el desenvolupament d'aplicacions mòbils. Hem explorat diverses opcions d'emmagatzematge disponibles en Flutter, incloent Preferències Compartides, Emmagatzematge de Fitxers, SQLite i Hive. També hem vist exemples pràctics de com utilitzar cadascuna d'aquestes opcions. En el proper tema, aprofundirem en l'ús de Preferències Compartides per emmagatzemar dades de l'usuari.
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ó