📜  在Flutter中使用 SQLite 持久化数据(1)

📅  最后修改于: 2023-12-03 15:23:23.286000             🧑  作者: Mango

在Flutter中使用SQLite持久化数据

在许多应用中,需要对数据进行持久化存储,以便在应用程序关闭后也能够保存数据。SQLite是一个轻量级的嵌入式数据库,可以很容易地用于Flutter应用程序来持久化数据。在本文中,我们将研究在Flutter中使用SQLite持久化数据的方法。

引入sqflite库

在开始之前,我们需要安装sqflite库,它是Flutter与SQLite交互的主要库。在pubspec.yaml文件中添加以下依赖项:

dependencies:
  sqflite: ^2.0.0+3

安装后,我们就可以开始使用SQLite数据库了。

创建数据库

首先,我们需要创建一个数据库,并在其中创建一个表来存储我们的数据。我们可以在应用程序的任何位置创建数据库,但更好的做法是将其放在单独的类中,以使代码更整洁。

以下是我们将使用的数据模型:

class Person {
  int id;
  String name;
  int age;

  Person({this.id, this.name, this.age});

  Map<String, dynamic> toMap() {
    return {'id': id, 'name': name, 'age': age};
  }

  static Person fromMap(Map<String, dynamic> map) {
    return Person(id: map['id'], name: map['name'], age: map['age']);
  }
}

这是我们创建数据库的方法:

import 'package:sqflite/sqflite.dart' as sql;
import 'package:path/path.dart' as path;

class DbHelper {
  static Future<sql.Database> createDatabase() async {
    final dbPath = await sql.getDatabasesPath();
    return sql.openDatabase(
      path.join(dbPath, 'person.db'),
      onCreate: (db, version) async {
        await db.execute(
            'CREATE TABLE persons (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)');
      },
      version: 1,
    );
  }
}

在上述代码中,我们通过调用getDatabasesPath()方法获取应用程序的数据库目录,并在其中创建名为“person.db” 的数据库。此处对表的结构和列进行了定义。

插入和查询数据

现在我们已经准备好向表中插入数据并将其检索出来。首先,我们将实现向表中插入Person的方法。

Future<int> insertPerson(Person person) async {
  final db = await DbHelper.createDatabase();
  return db.insert('persons', person.toMap(),
      conflictAlgorithm: sql.ConflictAlgorithm.replace);
}

在此方法中,我们打开数据库,将Person对象转换为Map并将其插入到名为“persons”的表中。如果已经存在具有相同键的行,则使用ConflictAlgorithm.replace参数将其替换。

接下来,我们将实现将所有人查询出来的方法。

Future<List<Person>> fetchPersons() async {
  final db = await DbHelper.createDatabase();
  final list = await db.query('persons');
  return list.map((json) => Person.fromMap(json)).toList();
}

在此方法中,我们打开数据库并查询名为“persons”的表。我们使用fromMap方法将返回的Map列表转换为Person对象,并将结果返回。

将结果放入UI

我们已经创建了数据库和将数据插入到其中的方法,现在我们将演示如何将结果放入Flutter的UI。将下面的代码添加到我们的例子中。

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final nameController = TextEditingController();
  final ageController = TextEditingController();
  final List<Person> persons = [];

  @override
  void initState() {
    super.initState();
    fetchPersons().then((list) {
      setState(() {
        persons.addAll(list);
      });
    });
  }

  @override
  void dispose() {
    nameController.dispose();
    ageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("SQLite Demo"),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: [
              TextFormField(
                controller: nameController,
                decoration: InputDecoration(labelText: 'Name'),
              ),
              TextFormField(
                controller: ageController,
                decoration: InputDecoration(labelText: 'Age'),
              ),
              FlatButton(
                onPressed: () async {
                  final person = Person(
                      name: nameController.text,
                      age: int.parse(ageController.text));
                  final id = await insertPerson(person);
                  person.id = id;
                  setState(() {
                    persons.add(person);
                  });
                },
                child: Text('Add Person'),
              ),
              Expanded(
                child: ListView.builder(
                  itemCount: persons.length,
                  itemBuilder: (ctx, index) {
                    return ListTile(
                      title: Text(persons[index].name),
                      subtitle: Text(persons[index].age.toString()),
                    );
                  },
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

在此示例中,我们使用TextFormField部件收集名称和年龄输入。我们还使用ListView来显示表中所有人的列表。

总结

这是如何在Flutter中使用SQLite数据库进行持久化数据的简单介绍。我们通过创建数据库和表以及插入和查询数据来实现此操作。我们还演示了如何将检索到的数据放入UI中。

完整的源代码请见这里