在flutter设计一个对本地数据库进行增删改查的例程
时间: 2024-02-27 19:51:56 浏览: 126
好的,下面是一个简单的例程,演示如何在 Flutter 中使用本地数据库进行增删改查操作:
1. 添加依赖
在 `pubspec.yaml` 文件中添加以下依赖:
```yaml
dependencies:
sqflite: ^2.0.0+3
path_provider: ^2.0.2
```
其中 `sqflite` 是 SQLite 数据库的 Flutter 插件,`path_provider` 是用于获取本地文件路径的插件。
2. 创建数据库
在 `lib` 目录下创建一个 `database_helper.dart` 文件,并添加以下代码:
```dart
import 'dart:async';
import 'dart:io' as io;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = new DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
static Database _db;
Future<Database> get db async {
if (_db != null) return _db;
_db = await initDb();
return _db;
}
DatabaseHelper.internal();
initDb() async {
io.Directory documentsDirectory =
await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "my_database.db");
var theDb = await openDatabase(path, version: 1, onCreate: _onCreate);
return theDb;
}
void _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE my_table (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''');
}
Future<int> insert(Map<String, dynamic> row) async {
var dbClient = await db;
return await dbClient.insert('my_table', row);
}
Future<int> update(Map<String, dynamic> row) async {
var dbClient = await db;
return await dbClient.update('my_table', row,
where: 'id = ?', whereArgs: [row['id']]);
}
Future<int> delete(int id) async {
var dbClient = await db;
return await dbClient.delete('my_table', where: 'id = ?', whereArgs: [id]);
}
Future<List<Map<String, dynamic>>> query() async {
var dbClient = await db;
return await dbClient.query('my_table');
}
}
```
这个类中包含了以下方法:
- `initDb()`:初始化数据库,并创建一个名为 `my_table` 的表。
- `insert()`:插入一行数据到 `my_table` 表中。
- `update()`:更新 `my_table` 表中的一行数据。
- `delete()`:从 `my_table` 表中删除指定 ID 的数据。
- `query()`:查询 `my_table` 表中的所有数据。
3. 使用数据库
在需要使用数据库的地方,可以通过以下方式来使用:
```dart
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'database_helper.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final dbHelper = DatabaseHelper();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SQLite Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text('Insert'),
onPressed: () {
_insert();
},
),
RaisedButton(
child: Text('Update'),
onPressed: () {
_update();
},
),
RaisedButton(
child: Text('Delete'),
onPressed: () {
_delete();
},
),
RaisedButton(
child: Text('Query'),
onPressed: () {
_query();
},
),
],
),
),
);
}
void _insert() async {
Map<String, dynamic> row = {
'name': 'John',
'age': 30,
};
final id = await dbHelper.insert(row);
print('inserted row id: $id');
}
void _update() async {
Map<String, dynamic> row = {
'id': 1,
'name': 'Mary',
'age': 25,
};
final rowsAffected = await dbHelper.update(row);
print('updated $rowsAffected row(s)');
}
void _delete() async {
final rowsDeleted = await dbHelper.delete(1);
print('deleted $rowsDeleted row(s)');
}
void _query() async {
final allRows = await dbHelper.query();
allRows.forEach((row) => print(row));
}
}
```
在这个例子中,我们使用了 `DatabaseHelper` 类来创建和管理数据库。在 `HomePage` 中,我们通过 `dbHelper` 实例来调用数据库操作方法。在每个操作方法中,我们都使用了 `async` 和 `await` 关键字来异步执行数据库操作。
这个例子只是一个简单的示例,实际上,你可以根据需要修改 `DatabaseHelper` 类来满足你的具体需求。
阅读全文