前言
数据库存储是我们常用的存储方式之一,对大批量数据有增、删、改、查操作需求时,我们就会想到使用数据库,Flutter中提供了一个sqflite插件供我们用于大量数据执行CRUD操作。本篇我们就来一起学习sqflite的使用。
sqflite使用
引入插件
在pubspec.yaml文件中添加path_provider插件,最新版本为1.0.0,如下:
dependencies:
flutter:
sdk: flutter
#sqflite插件
sqflite: 1.0.0
复制代码
然后命令行执行flutter packages get
即可将插件下载到本地。
数据库操作方法介绍
1. 插入操作
插入数据操作有两个方法:
Future rawInsert(String sql, [List arguments]);
Future insert(String table, Map values,
{String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
复制代码
rawInsert
方法第一个参数为一条插入sql语句,可以使用?
作为占位符,通过第二个参数填充数据。
insert
方法第一个参数为操作的表名,第二个参数map中是想要添加的字段名和对应字段值。
2. 查询操作
查询操作同样实现了两个方法:
Future>> query(String table,
{bool distinct,
List columns,
String where,
List whereArgs,
String groupBy,
String having,
String orderBy,
int limit,
int offset});
Future>> rawQuery(String sql,
[List arguments]);
复制代码
query
方法第一个参数为操作的表名,后边的可选参数依次表示是否去重、查询字段、WHERE子句(可使用?
作为占位符)、WHERE子句占位符参数值、GROUP BY子句、HAVING子句、ORDER BY子句、查询的条数、查询的偏移位等。
rawQuery
方法第一个参数为一条查询sql语句,可以使用?
作为占位符,通过第二个参数填充数据。
3. 修改操作
修改操作同样实现了两个方法:
Future rawUpdate(String sql, [List arguments]);
Future update(String table, Map values,
{String where,
List whereArgs,
ConflictAlgorithm conflictAlgorithm});
复制代码
rawUpdate
方法第一个参数为一条更新sql语句,可以使用?
作为占位符,通过第二个参数填充数据。
update
方法第一个参数为操作的表名,第二个参数为修改的字段和对应值,后边的可选参数依次表示WHERE子句(可使用?
作为占位符)、WHERE子句占位符参数值、发生冲突时的操作算法(包括回滚、终止、忽略等等)。
4. 删除操作
修改操作同样实现了两个方法:
Future rawDelete(String sql, [List arguments]);
Future delete(String table, {String where, List whereArgs});
复制代码
rawDelete
方法第一个参数为一条删除sql语句,可以使用?
作为占位符,通过第二个参数填充数据。
delete
方法第一个参数为操作的表名,后边的可选参数依次表示WHERE子句(可使用?
作为占位符)、WHERE子句占位符参数值。
举个栗子
我们以图书管理系统来举例。
首先,我们创建一个书籍类,包括书籍ID、书名、作者、价格、出版社等信息。
final String tableBook = 'book';
final String columnId = '_id';
final String columnName = 'name';
final String columnAuthor = 'author';
final String columnPrice = 'price';
final String columnPublishingHouse = 'publishingHouse';
class Book {
int id;
String name;
String author;
double price;
String publishingHouse;
Map toMap() {
var map = {
columnName: name,
columnAuthor: author,
columnPrice: price,
columnPublishingHouse: publishingHouse
};
if (id != null) {
map[columnId] = id;
}
return map;
}
Book();
Book.fromMap(Map map) {
id = map[columnId];
name = map[columnName];
author = map[columnAuthor];
price = map[columnPrice];
publishingHouse = map[columnPublishingHouse];
}
}
复制代码
其次,我们开始实现数据库相关操作:
1. 创建数据库文件和对应的表
// 获取数据库文件的存储路径
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'demo.db');
//根据数据库文件路径和数据库版本号创建数据库表
db = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute('''
CREATE TABLE $tableBook (
$columnId INTEGER PRIMARY KEY,
$columnName TEXT,
$columnAuthor TEXT,
$columnPrice REAL,
$columnPublishingHouse TEXT)
''');
});
复制代码
2. CRUD操作实现
// 插入一条书籍数据
Future insert(Book book) async {
book.id = await db.insert(tableBook, book.toMap());
return book;
}
// 查找所有书籍信息
Future> queryAll() async {
List
3. 关闭数据库
数据库对象使用完之后要在适当的时候关闭掉,可在helper类中实现以下方法。
Future close() async => db.close();
复制代码
运行效果:
事务
sqflite同时支持事务,通过事务可以将多条原子操作放在一起执行,保证操作要么全部执行完成,要么都不执行。 比如有两条书籍数据必须全部插入书库中才算添加成功,则使用如下方法
Future insertTwoBook(Book book1, Book book2) async {
return await db.transaction((Transaction txn) async {
book1.id = await db.insert(tableBook, book1.toMap());
book2.id = await db.insert(tableBook, book2.toMap());
print('book1.id = ${book1.id}, book2.id = ${book2.id}');
return book1.id != null && book2.id != null;
});
}
复制代码
写在最后
以上介绍了sqflite中我们常用的几个操作,有了sqflite我们就可以开发更丰富的应用程序,在开发实践中大家遇到任何问题都可以给我们发消息反馈,大家一起交流探讨共同进步。针对一些用户的反馈我们将在下一篇介绍Flutter的代码调试。
说明:
文章转载自对应的“Flutter编程指南”微信公众号,更多Flutter相关技术文章打开微信扫描二维码关注微信公众号获取。