📅  最后修改于: 2023-12-03 15:23:23.286000             🧑  作者: Mango
在许多应用中,需要对数据进行持久化存储,以便在应用程序关闭后也能够保存数据。SQLite是一个轻量级的嵌入式数据库,可以很容易地用于Flutter应用程序来持久化数据。在本文中,我们将研究在Flutter中使用SQLite持久化数据的方法。
在开始之前,我们需要安装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对象,并将结果返回。
我们已经创建了数据库和将数据插入到其中的方法,现在我们将演示如何将结果放入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中。
完整的源代码请见这里。