在 Flutter 中使用 SQLite 数据库,通常我们会使用 sqflite
库。这个库是一个 SQLite 插件,用于在 Flutter 应用中进行本地数据库操作。接下来,我们将了解如何在 Flutter 中使用和封装 SQLite。
添加依赖
首先,需要在 pubspec.yaml
文件中添加 sqflite
和 path_provider
依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.0.0+4
path_provider: ^2.0.9
创建一个数据库工具类
新建一个名为 database_helper.dart
的文件,用于封装数据库操作:
import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseHelper {
static final _databaseName = "MyDatabase.db";
static final _databaseVersion = 1;
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database? _database;
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
_initDatabase() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, _databaseName);
return await openDatabase(
path,
version: _databaseVersion,
onCreate: _onCreate,
);
}
Future _onCreate(Database db, int version) async {
// 在这里创建表和初始化数据
}
}
创建表
在 _onCreate
方法中,创建数据库表。例如,我们创建一个 user
表:
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''');
}
封装基本操作
接下来,我们需要在 DatabaseHelper
类中封装基本的数据库操作,例如增加、删除、修改和查询。
// 插入数据
Future<int> insert(Map<String, dynamic> row, String tableName) async {
Database db = await instance.database;
return await db.insert(tableName, row);
}
// 查询所有数据
Future<List<Map<String, dynamic>>> queryAll(String tableName) async {
Database db = await instance.database;
return await db.query(tableName);
}
// 根据条件查询
Future<List<Map<String, dynamic>>> queryByCondition(
String tableName, {
required String where,
required List<dynamic> whereArgs,
}) async {
Database db = await instance.database;
return await db.query(tableName, where: where, whereArgs: whereArgs);
}
// 更新数据
Future<int> update(Map<String, dynamic> row, String tableName,
{required String where, required List<dynamic> whereArgs}) async {
Database db = await instance.database;
return await db.update(tableName, row, where: where, whereArgs: whereArgs);
}
// 删除数据
Future<int> delete(String tableName,
{required String where, required List<dynamic> whereArgs}) async {
Database db = await instance.database;
return await db.delete(tableName, where: where, whereArgs: whereArgs);
}
// 分页查询
Future<List<Map<String, dynamic>>> queryPaged(
String tableName, {
int perPage = 10,
int page = 1,
String orderBy,
String where,
List<dynamic> whereArgs,
}) async {
Database db = await instance.database;
// 计算偏移量
int offset = (page - 1) * perPage;
// 构造查询语句
StringBuffer query = StringBuffer('SELECT * FROM $tableName');
// 添加筛选条件
if (where != null && whereArgs != null) {
query.write(' WHERE $where');
}
// 添加排序条件
if (orderBy != null) {
query.write(' ORDER BY $orderBy');
}
// 添加分页条件
query.write(' LIMIT $perPage OFFSET $offset');
// 执行查询
return await db.rawQuery(query.toString(), whereArgs);
}
使用封装的数据库工具类
现在我们已经封装了 DatabaseHelper
类,可以在其他地方使用它进行数据库操作。假设我们有一个 User
数据模型:
class User {
final int id;
final String name;
final int age;
User({required this.id, required this.name, required this.age});
Map<String, dynamic> toMap() {
return {'id': id, 'name': name, 'age': age};
}
}
以下是如何使用 DatabaseHelper
进行数据库操作的示例:
import 'database_helper.dart';
import 'user.dart';
void main() async {
final dbHelper = DatabaseHelper.instance;
// 插入数据
User user1 = User(id: 1, name: 'John Doe', age: 28);
int id1 = await dbHelper.insert(user1.toMap(), 'user');
print('插入数据: $id1');
User user2 = User(id: 2, name: 'Jane Doe', age: 26);
int id2 = await dbHelper.insert(user2.toMap(), 'user');
print('插入数据: $id2');
// 查询所有数据
List<Map<String, dynamic>> queryRows = await dbHelper.queryAll('user');
print('查询所有数据: $queryRows');
// 根据条件查询
List<Map<String, dynamic>> result = await dbHelper.queryByCondition(
'user',
where: 'age > ?',
whereArgs: [25],
);
print('查询年龄大于 25 的用户: $result');
// 更新数据
User updatedUser = User(id: 1, name: 'John Doe', age: 30);
int updatedRows = await dbHelper.update(
updatedUser.toMap(),
'user',
where: 'id = ?',
whereArgs: [user1.id],
);
print('更新数据影响行数: $updatedRows');
// 删除数据
int deletedRows = await dbHelper.delete(
'user',
where: 'id = ?',
whereArgs: [user1.id],
);
print('删除数据影响行数: $deletedRows');
}
在这个示例中,我们创建了两个 User
对象并将它们插入数据库。然后,我们查询了所有用户和年龄大于 25 的用户。接着,我们更新了一个用户的年龄,并删除了一个用户。
以上就是在 Flutter 中使用 SQLite 的一个简单封装和使用示例。您可以根据自己的需求对 DatabaseHelper
类进行扩展,以便更方便地在应用程序中使用 SQLite 数据库。