掌握Flutter本地存储:一步步教你使用Sqflite构建高效数据库
是一个非常流行且强大的SQLite插件,它允许开发者在移动设备上轻松地进行数据库操作。本文将通过具体的使用案例,详细介绍如何在Flutter项目中集成和使用 sqflite。随着移动应用的发展,本地数据存储成为了一个不可或缺的功能。在Flutter中,sqflite。来安装依赖,或者直接执行下面的命令。进行数据存储和查询。
目录
引言
随着移动应用的发展,本地数据存储成为了一个不可或缺的功能。在Flutter中,sqflite
是一个非常流行且强大的SQLite插件,它允许开发者在移动设备上轻松地进行数据库操作。本文将通过具体的使用案例,详细介绍如何在Flutter项目中集成和使用 sqflite
进行数据存储和查询。
安装sqflite
首先,你需要在 pubspec.yaml
文件中添加 sqflite
依赖:
dependencies:
flutter:
sdk: flutter
sqflite: ^2.3.3+1
然后运行 flutter pub get
来安装依赖,或者直接执行下面的命令
flutter pub add sqflite
使用方法
创建表
为了存储数据,我们需要创建一个表来保存我们的信息。这里我们创建了一个名为 Domain
的表,用于存储URL信息。
// 创建表
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE Domain (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT
)
''');
}
这段代码定义了一个异步函数 _onCreate
,当数据库首次创建时会调用此函数。在这个函数中,我们通过SQL语句创建了一个包含两个字段的表:id
(自动递增)和url
(文本类型)。
查询数据
查询数据是数据库操作中最常见的需求之一。这里展示了两种查询方式:获取所有记录以及检查特定记录是否存在。
// 查看表的数据
Future<List<Map<String, dynamic>>> getItemsFromTable() async {
Database db = await database;
return await db.query("Domain");
}
// 查看存在某一条数据
Future<bool> checkIfQrExists(String url) async {
Database db = await database;
List<Map<String, dynamic>> results = await db.query(
'Domain',
where: 'url= ?',
whereArgs: [url],
);
return results.isNotEmpty;
}
第一个函数 getItemsFromTable
返回表中的所有记录。第二个函数 checkIfQrExists
则接受一个URL作为参数,并返回一个布尔值,指示该URL是否存在于数据库中。
添加数据
添加新记录到数据库中也非常简单:
Future<void> insertDomain(String url) async {
Database db = await database;
await db.insert('Domain', {
'url': url,
});
}
这个函数接收一个URL字符串作为输入,并将其插入到 Domain
表中。如果插入成功,则不会返回任何内容。
删除数据
删除不需要的数据同样重要:
Future<void> deleteUrl(String url) async {
final db = await database;
await db.delete(
'Domain',
where: 'url = ?',
whereArgs: [url],
);
}
这个函数接收一个URL字符串,并从 Domain
表中删除与之匹配的所有记录。
更新数据
更新现有记录也很容易实现:
Future<void> updateUrl(Map<String, dynamic> domain, String url) async {
final db = await database;
await db.update(
'Domain',
domain,
where: 'url = ?',
whereArgs: [url],
);
}
此函数接收一个新的域对象和旧的URL字符串,然后使用这些信息更新数据库中的相应记录。
完整使用案例
这里提供了一个完整的示例,展示了如何封装上述所有功能在一个辅助类中,以便更方便地管理和操作数据库。
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = DatabaseHelper._internal();
factory DatabaseHelper() => _instance;
static Database? _database;
static const int databaseVersion = 2;
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(), 'app_database.db');
return await openDatabase(
path,
version: databaseVersion,
onCreate: _onCreate,
onUpgrade: _onUpgrade,
);
}
// 创建表
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE Domain (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT
)
''');
}
Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
print("版本号为$oldVersion");
if (oldVersion < 2) {
// 更新数据库的操作
}
}
// 查看表的数据
Future<List<Map<String, dynamic>>> getItemsFromTable() async {
Database db = await database;
return await db.query("Domain");
}
// 查看存在某一条数据
Future<bool> checkIfQrExists(String url) async {
Database db = await database;
List<Map<String, dynamic>> results = await db.query(
'Domain',
where: 'url= ?',
whereArgs: [url],
);
return results.isNotEmpty;
}
// 增加一条数据
Future<void> insertDomain(String url) async {
Database db = await database;
await db.insert('Domain', {
'url': url,
});
}
// 更新一条数据
Future<void> updateUrl(Map<String, dynamic> domain, String url) async {
final db = await database;
await db.update(
'Domain',
domain,
where: 'url = ?',
whereArgs: [url],
);
}
}
使用时
DatabaseHelper dbHelper = DatabaseHelper();
Future<void> getDatabaseData() async {
List<Map<String, dynamic>> data = await dbHelper.getItemsFromTable();
for (var item in data) {
print('Item: ${item.toString()}');
}
}

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)