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.
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.
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
)
''');
}
}
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
DatabaseHelper
et sqflite
si vous êtes dans un autre fichier (comme Main.Dart).Map<String, dynamic>
Pour mapper les noms de colonne aux données de chaque ligne.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]);