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:

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. Crea una aplicació Flutter que permeti a l'usuari introduir el seu nom i edat.
  2. Emmagatzema aquestes dades utilitzant Preferències Compartides.
  3. 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

Mòdul 2: Conceptes Bàsics de Programació en Dart

Mòdul 3: Widgets de Flutter

Mòdul 4: Gestió de l'Estat

Mòdul 5: Navegació i Enrutament

Mòdul 6: Xarxes i APIs

Mòdul 7: Persistència i Emmagatzematge

Mòdul 8: Conceptes Avançats de Flutter

Mòdul 9: Proves i Depuració

Mòdul 10: Desplegament i Manteniment

Mòdul 11: Flutter per a Web i Escriptori

© Copyright 2024. Tots els drets reservats