Flutter数据库管理插件db的使用
Flutter数据库管理插件db的使用
在本教程中,我们将学习如何在Flutter应用中使用数据库管理插件。这里我们以一个简单的例子来展示如何创建数据库、插入数据、查询数据以及删除数据。
项目结构
在开始之前,让我们先看看项目的基本结构:
my_flutter_app/
├── android/
├── ios/
├── lib/
│ ├── main.dart
│ └── database_helper.dart
├── test/
└── pubspec.yaml
添加依赖
首先,在pubspec.yaml
文件中添加必要的依赖项。这里我们使用sqflite
作为数据库插件。
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+3
path_provider: ^2.0.2
然后运行flutter pub get
来安装这些依赖。
创建数据库帮助类
接下来,我们需要创建一个帮助类来处理数据库操作。在lib/database_helper.dart
文件中编写以下代码:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final _databaseName = "my_database.db";
static final _databaseVersion = 1;
// 定义表名和列名
static final table = 'my_table';
static final columnId = '_id';
static final columnName = 'name';
// 单例模式
static Database? _database;
Future<Database?> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
_initDatabase() async {
String path = join(await getDatabasesPath(), _databaseName);
return await openDatabase(
path,
version: _databaseVersion,
onCreate: _onCreate,
);
}
// 创建表
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$columnId INTEGER PRIMARY KEY,
$columnName TEXT NOT NULL
)
''');
}
// 插入数据
Future<int> insert(Map<String, dynamic> row) async {
Database? db = await this.database;
return await db!.insert(table, row);
}
// 查询所有数据
Future<List<Map<String, dynamic>>> queryAllRows() async {
Database? db = await this.database;
return await db!.query(table);
}
// 删除数据
Future<int> delete(int id) async {
Database? db = await this.database;
return await db!.delete(
table,
where: '$columnId = ?',
whereArgs: [id],
);
}
}
在主文件中使用数据库
现在,我们可以在主文件main.dart
中使用上面定义的帮助类来进行数据库操作。以下是完整的main.dart
代码:
import 'package:flutter/material.dart';
import 'database_helper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter 数据库示例',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter 数据库示例'),
),
body: Home(),
),
);
}
}
class Home extends StatefulWidget {
[@override](/user/override)
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
late Future<List<Map<String, dynamic>>> futureData;
[@override](/user/override)
void initState() {
super.initState();
futureData = DatabaseHelper().queryAllRows();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
await DatabaseHelper().insert({
DatabaseHelper.columnName: '测试名称'
});
setState(() {
futureData = DatabaseHelper().queryAllRows();
});
},
child: Text('添加数据'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
await DatabaseHelper().delete(1); // 假设要删除的数据ID为1
setState(() {
futureData = DatabaseHelper().queryAllRows();
});
},
child: Text('删除数据'),
),
SizedBox(height: 20),
Expanded(
child: FutureBuilder<List<Map<String, dynamic>>>(
future: futureData,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data?.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(snapshot.data![index][DatabaseHelper.columnName]),
);
},
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
return CircularProgressIndicator();
},
),
),
],
),
);
}
}
更多关于Flutter数据库管理插件db的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库管理插件db的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,sqflite
是一个非常流行的插件,用于在移动应用中管理 SQLite 数据库。以下是如何使用 sqflite
插件进行数据库管理的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 sqflite
和 path
依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4
path: ^1.8.0
然后运行 flutter pub get
来安装依赖。
2. 创建数据库并定义表
接下来,创建一个数据库并定义表结构。通常我们会创建一个单独的类来管理数据库操作。
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
static Database? _database;
factory DatabaseHelper() {
return _instance;
}
DatabaseHelper._internal();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'my_database.db');
return await openDatabase(
path,
version: 1,
onCreate: _onCreate,
);
}
Future<void> _onCreate(Database db, int version) async {
await db.execute(
'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
}
}
3. 插入数据
你可以使用 insert
方法将数据插入到数据库表中。
Future<void> insertUser(Map<String, dynamic> user) async {
Database db = await DatabaseHelper().database;
await db.insert(
'users',
user,
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
4. 查询数据
你可以使用 query
方法从数据库表中查询数据。
Future<List<Map<String, dynamic>>> getUsers() async {
Database db = await DatabaseHelper().database;
return await db.query('users');
}
5. 更新数据
你可以使用 update
方法更新数据库表中的数据。
Future<void> updateUser(Map<String, dynamic> user) async {
Database db = await DatabaseHelper().database;
await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [user['id']],
);
}
6. 删除数据
你可以使用 delete
方法从数据库表中删除数据。
Future<void> deleteUser(int id) async {
Database db = await DatabaseHelper().database;
await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
7. 关闭数据库
当你不再需要数据库连接时,可以关闭数据库。
Future<void> closeDatabase() async {
Database db = await DatabaseHelper().database;
await db.close();
}
8. 完整示例
以下是一个完整的示例,展示了如何使用 sqflite
插件进行数据库操作:
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final dbHelper = DatabaseHelper();
// Insert a user
await dbHelper.insertUser({'id': 1, 'name': 'John Doe', 'age': 30});
// Query all users
List<Map<String, dynamic>> users = await dbHelper.getUsers();
print(users);
// Update a user
await dbHelper.updateUser({'id': 1, 'name': 'John Smith', 'age': 31});
// Query all users again
users = await dbHelper.getUsers();
print(users);
// Delete a user
await dbHelper.deleteUser(1);
// Query all users one last time
users = await dbHelper.getUsers();
print(users);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter SQLite Example'),
),
body: Center(
child: Text('Check the console for database operations.'),
),
),
);
}
}
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
static Database? _database;
factory DatabaseHelper() {
return _instance;
}
DatabaseHelper._internal();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'my_database.db');
return await openDatabase(
path,
version: 1,
onCreate: _onCreate,
);
}
Future<void> _onCreate(Database db, int version) async {
await db.execute(
'CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
);
}
Future<void> insertUser(Map<String, dynamic> user) async {
Database db = await database;
await db.insert(
'users',
user,
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
Future<List<Map<String, dynamic>>> getUsers() async {
Database db = await database;
return await db.query('users');
}
Future<void> updateUser(Map<String, dynamic> user) async {
Database db = await database;
await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [user['id']],
);
}
Future<void> deleteUser(int id) async {
Database db = await database;
await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
Future<void> closeDatabase() async {
Database db = await database;
await db.close();
}
}