web-dev-qa-db-fra.com

Comment faire une mise à jour de la base de données avec SQFLITE in Flutter

Comment mettez-vous à jour les données dans une rangée de table en flutter à l'aide du plug-in SQFLITE?

Il existe un certain nombre de questions de résolution de problèmes (voir - this et - this ) mais aucune que je ne puisse trouver pour ajouter une réponse canonique à. Ma réponse est ci-dessous.

4
Suragch

Ajouter les dépendances

Ouvrir pubspec.yaml Et dans la section DEPENDANCE, ajoutez les lignes suivantes:

sqflite: ^1.0.0
path_provider: ^0.4.1

Le plugin sqflite de sqflite est le cours et le path_provider Nous aidera à obtenir le répertoire utilisateur sur Android et iPhone.

Faire une classe d'assistance de base de données

Je garde une référence globale à la base de données dans une classe Singleton. Cela empêchera les problèmes de concurrence et les fuites de données (c'est ce que j'entendra, mais dites-moi si je me trompe). Vous pouvez également ajouter des méthodes d'assistance (comme la mise à jour) ici pour accéder à la base de données.

Créez un nouveau fichier appelé base de données_helper.dart et coller dans le code suivant:

import 'Dart:io' show Directory;
import 'package:path/path.Dart' show join;
import 'package:sqflite/sqflite.Dart';
import 'package:path_provider/path_provider.Dart' show getApplicationDocumentsDirectory;

class DatabaseHelper {

  static final _databaseName = "MyDatabase.db";
  static final _databaseVersion = 1;

  static final table = 'my_table';

  static final columnId = '_id';
  static final columnName = 'name';
  static final columnAge = 'age';

  // make this a singleton class
  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  // only have a single app-wide reference to the database
  static Database _database;
  Future<Database> get database async {
    if (_database != null) return _database;
    // lazily instantiate the db the first time it is accessed
    _database = await _initDatabase();
    return _database;
  }

  // this opens the database (and creates it if it doesn't exist)
  _initDatabase() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, _databaseName);
    return await openDatabase(path,
        version: _databaseVersion,
        onCreate: _onCreate);
  }

  // SQL code to create the database table
  Future _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY,
            $columnName TEXT NOT NULL,
            $columnAge INTEGER NOT NULL
          )
          ''');
  }
}

Mettre à jour la ligne

Premièrement laisse insérer une ligne afin que nous ayons quelque chose à mettre à jour:

  _insert() async {
    Database db = await DatabaseHelper.instance.database;
    Map<String, dynamic> row = {
      DatabaseHelper.columnName : 'Bob',
      DatabaseHelper.columnAge  : 23
    };
    int id = await db.insert(DatabaseHelper.table, row);
    print(await db.query(DatabaseHelper.table));
  }

Ensuite, c'est comment faire la mise à jour:

  _update() async {

    // get a reference to the database
    // because this is an expensive operation we use async and await
    Database db = await DatabaseHelper.instance.database;

    // row to update
    Map<String, dynamic> row = {
      DatabaseHelper.columnName : 'Mary',
      DatabaseHelper.columnAge  : 32
    };

    // We'll update the first row just as an example
    int id = 1;

    // do the update and get the number of affected rows
    int updateCount = await db.update(
        DatabaseHelper.table,
        row,
        where: '${DatabaseHelper.columnId} = ?',
        whereArgs: [id]);

    // show the results: print all rows in the db
    print(await db.query(DatabaseHelper.table));
  }

Remarques

  • Vous devrez importer la classe DatabaseHelper et sqflite si vous êtes dans un autre fichier (comme Main.Dart).
  • Le plug-in SQFLITE utilise un Map<String, dynamic> Pour mapper les noms de colonne aux données de chaque ligne.

Mise à jour brute

SQFLITE prend également en charge faire une mise à jour brute. Cela signifie que vous pouvez utiliser une chaîne SQL. Permet de mettre à jour la même ligne à nouveau à l'aide de rawUpdate().

int updateCount = await db.rawUpdate('''
    UPDATE my_table 
    SET name = ?, age = ? 
    WHERE _id = ?
    ''', 
    ['Susan', 13, 1]);

Les éléments entre les crochets à la fin sont liés à la ? Points d'interrogation dans la chaîne SQL. Vous pouvez utiliser l'interpolation pour remplir les noms de table et de colonne, mais vous ne devez pas utiliser l'interpolation pour les valeurs en raison du danger d'attaques d'injection SQL.

int updateCount = await db.rawUpdate('''
    UPDATE ${DatabaseHelper.table} 
    SET ${DatabaseHelper.columnName} = ?, ${DatabaseHelper.columnAge} = ? 
    WHERE ${DatabaseHelper.columnId} = ?
    ''',
    ['Susan', 13, 1]);
17
Suragch