Flutter开发笔记 —— sqflite插件数据库应用

这篇具有很好参考价值的文章主要介绍了Flutter开发笔记 —— sqflite插件数据库应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

今天在观阅掘金大佬文章的时候,了解到了该 sqflite 插件,结合官网教程和自己实践,由此总结出该文,希望对大家的学习有帮助!

插件详情

Flutter的 SQLite 插件。支持 iOS、Android 和 MacOS。

  • 支持事务和batch模式
  • 打开时自动进行版本管理
  • 插入/查询/更新/删除查询的助手
  • iOS 和 Android 上的数据库操作在后台线程中执行

插件地址: https://pub.dev/packages/sqflite

本文使用插件版本为最新版本:2.3.0

基础介绍

数据表创建

  • openDatabase() 连接数据库
  • deleteDatabase() 删除数据库

openDataBase方法 可选参为db文件地址、版本号、相关回调

案例速览

late Database db;
final database = "book.db";
final table = "book";

/*
 * @author Marinda
 * @date 2023/12/13 15:53
 * @description 连接数据库
 */
connection() async{
  //获取
  var databasePath = await getDatabasesPath();
  String path = p.join(databasePath,database);
  //删除数据库
  await deleteDatabase(path);
  print('当前地址:${path}');
  if(File(path).existsSync()){
    db = await openDatabase(path);
  }else{
    db = await openDatabase(path,version: 1,onCreate: (database,version) async{
      database.execute("CREATE TABLE `${table}` (id integer primary key autoincrement,name text not null,price REAL ,author TEXT NOT NULL,description TEXT)");
    });
  }
}

语句介绍

CURD方法介绍

  • 使用SQL语句的CURD前缀带raw (例如rawInsert)
  • 官方封装好的CURD语句不带raw(例如insert) ->全文使用该方法

语法速览

//前者
Future<int> rawInsert(String sql, [List<Object?>? arguments]);
//后者
Future<int> insert(String table, Map<String, Object?> values,
    {String? nullColumnHack, ConflictAlgorithm? conflictAlgorithm});

接下来看几个简单的CURD快速了解写法

insert(插入)

Future<int> insert() async{
  Map<String,dynamic> args = {
      "id": 1,
      "name": "张飞",
      "description": "猛将"
  };
  //返回id table为表名
  return await db.insert(table,args);
}

delete(删除)

Future<int> delete(int id) async{
  return await db.delete(table,where: "id = ?",whereArgs: [id]);
}

update(修改)

Future<int> update() async{
  Map<String,dynamic> args = {
      "id": 1,
      "name": "吕布",
      "description": "天下无双"
  };
  return await db.update(table, args,where: "id = ?",whereArgs: [args["id"]]);
}

select(查询)

/*
 * @author Marinda
 * @date 2023/12/13 16:11
 * @description 通过id查询
 */
Future<Map<String,dynamic>?> selectById(int id) async{
  var list = await db.query(table,where: "id = ?",whereArgs: [id]);
  if(list.isNotEmpty){
    return list.first;
  }
  return null;
}

现在我们对sqflite插件的基础使用有一个初步的了解了,接下来围绕一个书本表案例做实战

实战应用

  • 定义Book书表作为实体类
  • 定义DBBookProvider类处理数据库表

book.dart

/**
 * @author Marinda
 * @date 2023/12/13 15:42
 * @description 书籍信息
 */
class Book {
  int? _id;
  String? _name;
  double? _price;
  String? _author;
  String? _description;

  Book(
      {int? id,
        String? name,
        double? price,
        String? author,
        String? description}) {
    if (id != null) {
      this._id = id;
    }
    if (name != null) {
      this._name = name;
    }
    if (price != null) {
      this._price = price;
    }
    if (author != null) {
      this._author = author;
    }
    if (description != null) {
      this._description = description;
    }
  }

  int? get id => _id;
  set id(int? id) => _id = id;
  String? get name => _name;
  set name(String? name) => _name = name;
  double? get price => _price;
  set price(double? price) => _price = price;
  String? get author => _author;
  set author(String? author) => _author = author;
  String? get description => _description;
  set description(String? description) => _description = description;

  Book.fromJson(Map<String, dynamic> json) {
    _id = json['id'];
    _name = json['name'];
    _price = json['price'];
    _author = json['author'];
    _description = json['description'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this._id;
    data['name'] = this._name;
    data['price'] = this._price;
    data['author'] = this._author;
    data['description'] = this._description;
    return data;
  }
}

db_book_provider.dart

/**
 * @author Marinda
 * @date 2023/12/13 15:43
 * @description 书籍数据库适配器
 */

class DBBookProvider{
  late Database db;
  final database = "book.db";
  final table = "book";
  static DBBookProvider? _instance;
  static DBBookProvider instance = getInstance();
  DBBookProvider._();

  factory DBBookProvider(){
    return instance;
  }

  static getInstance(){
    if(_instance == null){
      _instance = DBBookProvider._();
    }
    return _instance ?? DBBookProvider._();
  }

  /*
   * @author Marinda
   * @date 2023/12/13 15:53
   * @description 连接数据库
   */
  connection() async{
    var databasePath = await getDatabasesPath();
    String path = p.join(databasePath,database);
    // await deleteDatabase(path);
    print('当前地址:${path}');
    if(File(path).existsSync()){
      db = await openDatabase(path);
    }else{
      db = await openDatabase(path,version: 1,onCreate: (database,version) async{
        database.execute("CREATE TABLE `${table}` (id integer primary key autoincrement,name text not null,price REAL ,author TEXT NOT NULL,description TEXT)");
      });
    }
  }


  /*
   * @author Marinda
   * @date 2023/12/13 16:01
   * @description 关闭数据库
   */
  close() async{
    await db.close();
  }

  /*
   * @author Marinda
   * @date 2023/12/13 16:02
   * @description 插入
   */
  Future<Book> insert(Book book) async{
    int id = await db.insert(table,book.toJson());
    book.id = id;
    return book;
  }

  /*
   * @author Marinda
   * @date 2023/12/13 16:08
   * @description 删除id
   */
  Future<int> delete(int id) async{
    return await db.delete(table,where: "id = ?",whereArgs: [id]);
  }

  /*
   * @author Marinda
   * @date 2023/12/13 16:11
   * @description 通过id查询
   */
  Future<Book?> selectById(int id) async{
    var list = await db.query(table,where: "id = ?",whereArgs: [id]);
    if(list.isNotEmpty){
      return Book.fromJson(list.first);
    }
    return null;
  }

  /*
   * @author Marinda
   * @date 2023/12/13 16:13
   * @description 获取所有书籍列表
   */
  Future<List<Book>> queryList() async{s
    var result = await db.query(table);
    return result.map((e) => Book.fromJson(e)).toList();
  }

  /*
   * @author Marinda
   * @date 2023/12/13 16:15
   * @description 修改书籍信息
   */
  Future<int> update(Book book) async{
    return await db.update(table, book.toJson(),where: "id = ?",whereArgs: [book.id]);
  }

}

实例化调用


initDatabase() async{
  DBBookProvider dbBookProvider = DBBookProvider.instance;
  //连接
  await dbBookProvider.connection();
  Book book = Book(
    name: "斗破苍穹",
    author: "天蚕土豆",
    price: 88.00,
    description: "一本不错的小说"
  );
  //插入
  Book element = await dbBookProvider.insert(book);
  print('element : ${element.toJson()}');
  //删除
  for(var id in result){
    await dbBookProvider.delete(id);
  }
 
  Book newBook = Book.fromJson(book.toJson());
  newBook.id = 1;
  newBook.author = "天蚕土豆";
   //修改
  await dbBookProvider.update(newBook);
  //查询全部
  var list = await dbBookProvider.queryList();
  print("当前列表: ${list.map((e) => e.toJson()).toList()}");
}

事务&batch

单独拉出来讲讲的原因是我在应用中踩了个坑

事务和batch是什么这个大家如果不了解的话自行百度一下,下文带大家简单看看案例

/*
 * @author Marinda
 * @date 2023/12/13 16:17
 * @description 批量插入全部书籍列表
 */
insertAll(List<Book> bookList) async{
  List resultList = [];
  await db.transaction((txn) async{
    Batch batch = txn.batch();
    for(var book in bookList){
      batch.insert(table,book.toJson());
    }
    //返回全部结果并且不跳过错误!
    resultList = await batch.commit(noResult: false,continueOnError: false);
    print('resultList: ${resultList}');
  });
  await close();
  return resultList;
}

注:在该案例中配合事务 batch.commit方法中如果continueOnError为false时 出现异常则会中止,导致前面插入回推。

注:在该insertAll()方法 或其他涉及事务的方法,都要执行完毕后主动调用close() 断开本次连接。否则会导致 Error Domain=FMDatabase Code=5 “database is locked”

如果已经出现 Error Domain=FMDatabase Code=5 “database is locked” 错误,请删除该数据库文件,重新生成。

结束语

感谢你的观看,希望对大家学习有帮助,有不对的地方欢迎指正!文章来源地址https://www.toymoban.com/news/detail-758094.html

到了这里,关于Flutter开发笔记 —— sqflite插件数据库应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件设计开发笔记4:QT操作SQLite数据库

      有时候我们需要在软件中记录一些历史数据以便于对数据的查询。而我们希望软件不能太复杂,体量也不要太大,这个时候就需要如SQLite这样轻量级的数据库。这篇中我们就来讨论如何在使用QT开发应用是操作SQLite数据库。   SQLite是一款开源、轻量级、跨平台的数据库

    2024年02月09日
    浏览(65)
  • QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

    如果需要在QT程序中实现与MySQL数据库的交互,那么必不可少的一环就是对Qt MySql数据库驱动的编译。 操作系统:Windows10 专业版 64位 Qt版本:Qt 5.15.2 开发环境Qt安装路径:D:Qt 交叉编译服务器:Ubuntu 18.4 交叉编译服务器Qt安装路径:/opt/Qt 目标芯片:rk3568 目标平台:arm64 Qt安装

    2024年02月11日
    浏览(78)
  • 【Flutter】Flutter 中 sqflite 的基本使用

    在开发 Flutter 应用时,我们经常需要使用到本地数据库来存储一些数据。sqflite 是一个为 Flutter 提供的 SQLite 插件,它支持 iOS、Android 和 MacOS。在这篇文章中,我们将简要介绍如何在 Fl

    2024年02月10日
    浏览(33)
  • 无涯教程-Flutter - 数据库

    SQLite\\\" class=\\\"css-1occaib\\\" SQLite 数据库是基于事实和标准SQL的嵌入式数据库引擎,它是小型且经过时间考验的数据库引擎,sqflite软件包提供了许多函数,可以有效地与SQLite数据库一起使用,它提供了操作SQLite数据库引擎的标准方法。 在Android Studio中创建一个新的Flutter应用程序pr

    2024年02月10日
    浏览(55)
  • 安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性

    DW + PHPStorm + PhpStudy + Navicat Premium DW : HTMLJSCSS开发 PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 1、数据库名,数据库表名,数据库列名 2、数据库数据,格式类型,长度,键等 PHP函数:连接,选择,执行,结果,关闭等 参考:https://www.runoo

    2024年02月17日
    浏览(61)
  • 【Python使用】嘿马头条完整开发md笔记第2篇:数据库,作用【附代码文档】

    嘿马头条项目从到完整开发笔记总结完整教程(附代码资料)主要内容讲述:课程简介,ToutiaoWeb虚拟机使用说明,Pycharm远程开发,产品与开发,数据库1 产品介绍,2 原型图与UI图,3 技术架构,4 开发。OSS对象存储,七牛云存储,CDN,缓存。缓存,缓存架构,缓存数据,缓存有效

    2024年03月18日
    浏览(53)
  • QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板

    在上一文《QT学习笔记-QT安装oracle oci驱动》中介绍了在Windows环境下使用QT访问oracle数据库时遇到驱动无法加载问题的解决办法,大体思路是对QT源码中数据库驱动的源码oci进行编译,要想通过编译需要依赖对应数据库的头文件和库(可以通过下载oracle instant client),编译通过

    2024年02月13日
    浏览(57)
  • Flutter中的Firebase:如何使用Flutter连接Firebase数据库

    作者:禅与计算机程序设计艺术 作为一名人工智能专家,程序员和软件架构师,我经常会被Flutter的技术魅力所吸引。Flutter作为Kotlin和JavaScript的混合编程语言,具有高效、快速、美观的开发体验。同时,Flutter也是Google推荐的跨平台移动应用开发首选。而在Flutter中,Firebase数

    2024年02月09日
    浏览(43)
  • Flutter 本地SQLite数据库版本升级处理

    前言 上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,数据表结构是可能发生改变的。但是 App 的版本会有碎片化的存在,如果数据表结构发生了改变,就需要对旧版本 App 的数据表结构进行同步,

    2023年04月09日
    浏览(45)
  • Flutter框架实现登录注册功能,不连接数据库

    要在Flutter框架中实现登录和注册功能,而不连接数据库,可以使用本地存储来存储用户信息。以下是一个简单的示例,演示如何使用本地存储来实现登录和注册功能。 首先,我们需要添加 shared_preferences 插件到 pubspec.yaml 文件中: 然后,在 lib 文件夹中创建一个新的文件夹

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包