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网络请求的使用与封装

Flutter学习日记之进度条的使用

Flutter学习日记之底部导航栏BottomNavigationBar组件的使用

Flutter学习日记之各种按钮的使用

Flutter学习日记之使用路由进行页面切换

Flutter学习日记之使用Drawer实现抽屉侧边栏效果