Flutter学习日记之数据库Sqflite的使用
Posted Android_小黑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter学习日记之数据库Sqflite的使用相关的知识,希望对你有一定的参考价值。
本文地址:https://blog.csdn.net/qq_40785165/article/details/117874180,转载需附上此地址
大家好,我是小黑,一个还没秃头的程序员~~~
生命太短暂,不要去做一些根本没有人想要的东西。
今天分享的内容是Flutter中的Sqflite数据库,用来在手机上进行数据的增删改查,源码地址:https://gitee.com/fjjxxy/flutter-study.git,效果如下:
也可参考我写的备忘录Demo中的数据库增删改查操作效果,Demo地址:Flutter学习日记之Flutter版备忘录,新人可入,可用作学生大作业
数据库增删改查中涉及到的实体类采用FlutterJsonBeanFactory插件进行生成,这里就不详细介绍了,具体步骤见之前博客:Flutter学习日记之Http&Dio网络请求的使用与封装
(一)打开数据库并创建表
代码如下:
final String tableNote = 'note';
final String columnId = 'note_id';
final String columnTitle = 'title';
final String columnContent = "content";
final String columnAddTime = "add_time";
final String columnUpdateTime = "update_time";
final String columnNoteCode = "note_code";
class SqliteHelper {
Database db;
Batch batch;
Future open() async {
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'note.db');
db = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
await db.execute(
"create table IF NOT EXISTS $tableNote($columnId INTEGER PRIMARY KEY AUTOINCREMENT ,$columnTitle varchar(20)" +
",$columnContent TEXT,$columnAddTime DATETIME,$columnUpdateTime DATETIME,$columnNoteCode TEXT)");
});
}
...
}
这里获取数据库位置的join函数需要引入以下类
import 'package:path/path.dart';
- onCreate:为初始化函数,建表的操作可以在这里面做
- onUpgrade:为版本更新函数,版本更新时数据库中列/表的改变可以在这里做
- onDowngrade:当数据库需要降级时设置
(二)增(insert)
先上代码:NoteBeanEntity 是插件生成的实体类,toJson是实体类中的方法,负责将实体类转为Map,最后把Map作为Api的参数传入
Future<NoteBeanEntity> insert(NoteBeanEntity noteBeanEntity) async {
Map map = noteBeanEntity.toJson();
noteBeanEntity.noteId = await db.insert(tableNote, map);
return noteBeanEntity;
}
insert返回的是最后一行插入数据的id,参数如下:
参数 | 说明 |
---|---|
table | 表名 |
values | 插入的数据Map |
nullColumnHack | 没有数据的列名,当列没数据时需要设置这个参数,不然会报错 |
conflictAlgorithm | 当插入或更新冲突时的解决,对应的是ConflictAlgorithm |
(三)删(delete)
代码如下:
Future<int> delete(int id) async {
return await db.delete(tableNote, where: '$columnId = ?', whereArgs: [id]);
}
delete返回的是删除的行数,参数如下:
参数 | 说明 |
---|---|
table | 表名 |
where | 删除条件 |
whereArgs | 删除条件中占位符(?)的值 |
(四)改(update)
代码如下:
Future<int> update(NoteBeanEntity note) async {
return await db.update(tableNote, note.toJson(),
where: '$columnId = ?', whereArgs: [note.noteId]);
}
update返回的是更新的行数,参数如下:
参数 | 说明 |
---|---|
table | 表名 |
where | 删除条件 |
whereArgs | 删除条件中占位符(?)的值 |
conflictAlgorithm | 当插入或更新冲突时的解决,对应的是ConflictAlgorithm |
(五)查(query)
代码如下:
Future<List<NoteBeanEntity>> searchNote(String keyWord, int type) async {
List<NoteBeanEntity> list = [];
var where =
"$columnTitle like '%$keyWord%' or $columnContent like '%$keyWord%'";
List<Map> maps;
switch (type) {
case 2:
maps = await db.query(tableNote,
where: where, orderBy: "$columnUpdateTime desc");
break;
case 1:
maps = await db.query(tableNote,
where: where, orderBy: "$columnAddTime desc");
break;
case 3:
maps = await db.query(tableNote,
where: where, orderBy: "$columnTitle asc");
break;
}
maps.map((e) {
list.add(NoteBeanEntity().fromJson(e));
}).toList();
return list;
}
上面代码中是一个模糊查询,返回的是Map数组,可以将Map转换成实体类返回,有利于读取数据,query的参数如下:
参数 | 说明 |
---|---|
table | 表名 |
distinct | 读取的数据是否去重 |
columns | 需要返回的列 |
where | 读取数据条件 |
whereArgs | 条件中占位符的值 |
groupBy | 对返回的数据进行分组的条件表达式或者列名 |
having | 对分组之后的数据进行筛选 |
orderBy | 根据某一列的值进行数据排序 |
limit | 分页查询时限制返回数据的数量 |
offset | 与limit搭配使用时表示先跳过几条再读取几条 |
(六)批量操作
sqflite还支持批量操作,返回的是包含每一个操作结果的数组,代码如下:
Future batchOperate() async {
batch = db.batch();
batch.delete(tableNote, where: "$columnTitle=?", whereArgs: ["0"]);
batch.update(tableNote, {"$columnTitle": 'flutter'},
where: '$columnTitle = ?', whereArgs: ["3"]);
List list = await batch.commit();
}
(七)关闭数据库
代码如下:
Future close() async => db.close();
到这里,Flutter中关于Sqflite数据库的内容就介绍完了,多写才能熟能生巧,感兴趣的小伙伴可以下载源码看一下,希望大家可以点个Star,支持一下小白的flutter学习经历,最后,希望喜欢我文章的朋友们可以帮忙点赞、收藏,也可以关注一下,如果有问题可以在评论区提出,后面我会持续更新Flutter的学习记录,与大家分享,谢谢大家的支持与阅读!
以上是关于Flutter学习日记之数据库Sqflite的使用的主要内容,如果未能解决你的问题,请参考以下文章
Flutter学习日记之Http&Dio网络请求的使用与封装