• sqflite: 是一款轻量级的关系型数据库,类似SQLite. 支持iOS和Android。适用于存储数据库 , 表类型的数据.

  • 使用:

  • 添加依赖

  • dependencies:flutter:sdk: flutter...#sqflite插件sqflite: ^1.1.6+1

    先练习一下官方文档上面的一些基础使用方法

  • _createDB() async {//获取数据库默认路径var databasePath = await getDatabasesPath();print('database default path is $databasePath');//join 需要import 'package:path/path.dart';String path = join(databasePath, 'order.db');await deleteDatabase(path);//打开数据库Database database = await openDatabase(path, version: 1,onCreate: (Database db, int version) async {//建表await db.execute('CREATE TABLE Test (id INTEGER PRIMARY KEY, memberName TEXT, dynamicBottom TEXT, productName TEXT)');});//insertawait database.transaction((txn) async {int id1 = await txn.rawInsert('INSERT INTO Test(memberName, dynamicBottom, productName) VALUES("岑需顿", "2019/07/12创建", "2018款 朗逸 1.5L 手动风尚版")');print('inserted1: $id1');int id2 = await txn.rawInsert('INSERT INTO Test(memberName, dynamicBottom, productName) VALUES("余界才", "2019/07/10创建", "2018款 朗逸 1.5L 手动风尚版")');print('inserted2: $id2');});//update
    //     int count = await database.rawUpdate(
    //     'UPDATE Test SET name = ?, VALUE = ? WHERE name = ?',
    //     ['updated name', '9876', 'some name']);
    // print('updated: $count');List<Map> list = await database.rawQuery('SELECT * FROM Test');print(list);// Close the databaseawait database.close();}

    然后以一个实际的订单列表页为例,做一下数据的存储,下面是我的书写代码的流程:

  • 1.首先做一个列表的页面,就不放代码了,然后写一个入口可以跳转进入列表页,随便展示几个字段

  • 2.建一个model 存放页面展示的元素属性

  • class Order {final String memberName;final String customerPhone;final String dynamicBottom;final String productName;StatusModel dynamicStatus;Order (this.memberName,this.customerPhone,this.dynamicBottom,this.productName,this.dynamicStatus,);Order.fromJson(Map json) : memberName = json['memberName'],customerPhone = json['customerPhone'],dynamicBottom = json['dynamicBottom'],productName = json['productName'],dynamicStatus = StatusModel.fromJson(json['dynamicStatus']);
    }class StatusModel {final String color;final String label;StatusModel (this.color,this.label,);StatusModel.fromJson(Map json): color = json['color'],label = json['label'];
    }

    写到这里model创建完了,但是怎么和数据库结合起来呢。这里我的想法是拿到数据之后,一般我们都是要解析json转换成model,在转换的时候就可以创建数据库,建表,然后进行存储;然后在需要的时候(比如断网)再从数据库里取出,转换成model。

  • 所以 要给model加两方法,一个是从sql转化到model,一个是model转化到map(DB的insert,update等方法需要数据以Map类型传入)

  • API:

  • // INSERT helperFuture<int> insert(String table, Map<String, dynamic> values,{String nullColumnHack, ConflictAlgorithm conflictAlgorithm});Future<int> update(String table, Map<String, dynamic> values,{String where,List<dynamic> whereArgs,ConflictAlgorithm conflictAlgorithm});

    所以加了下面这两个方法:

  • Order.fromSql(Map<String, dynamic> json) {memberName = json['memberName'];customerPhone = json['customerPhone'];dynamicBottom = json['dynamicBottom'];productName = json['productName'];dynamicStatus = StatusModel.fromJson(json['dynamicStatus']);}Map<String, dynamic> toJson() {final Map<String, dynamic> data = new Map<String, dynamic>();data['memberName'] = this.memberName;data['customerPhone'] = this.customerPhone;data['dynamicBottom'] = this.dynamicBottom;data['productName'] = this.productName;data['dynamicStatus'] = this.dynamicStatus;return data;}

    3.写一个创建DB的类

  • 写的过程中,为了实现update方法,又添加了一个唯一的属性orderNo,为了根据orderNo更新数据

  • class DatabaseHelper {static final DatabaseHelper _instance = new DatabaseHelper.internal();factory DatabaseHelper() => _instance;final String tableOrder = 'OrderTable';//表名称//每列名称final String columnId = 'id';final String memberName = 'memberName';final String dynamicBottom = 'dynamicBottom';final String productName = 'productName';final String customerPhone = 'customerPhone';final String color = 'color';final String label = 'label';final String orderNo = 'orderNo';static Database _db;DatabaseHelper.internal();Future<Database> get db async {//这里修改了判断条件,因为每次执行完都会关闭,只判断是否null 会导致下次执行时数据库是close状态if (_db != null && _db.isOpen) {return _db;}_db = await initDb();return _db;}initDb() async {String databasesPath = await getDatabasesPath();String path = join(databasesPath, 'orderlist.db');var db = await openDatabase(path, version: 1, onCreate: _onCreate);return db;}void _onCreate(Database db, int newVersion) async {await db.execute('CREATE TABLE $tableOrder ($columnId INTEGER PRIMARY KEY, $memberName TEXT, $dynamicBottom TEXT, $productName TEXT, $customerPhone TEXT, $color TEXT, $label TEXT, $orderNo TEXT)');}Future<int> insertOrder(Order order) async {var dbClient = await db;var result = await dbClient.insert(tableOrder, order.toJson());return result;}Future<List> selectOrders({int limit, int offset}) async {var dbClient = await db;var result = await dbClient.query(tableOrder,columns: [columnId, memberName, customerPhone, productName, color, label],limit: limit,offset: offset,);List<Order> orders = [];result.forEach((item) => orders.add(Order.fromSql(item)));return orders;}Future<int> getCount() async {var dbClient = await db;return Sqflite.firstIntValue(await dbClient.rawQuery('SELECT COUNT(*) FROM $tableOrder'));}Future<Order> getOrder(int id) async {var dbClient = await db;List<Map> result = await dbClient.query(tableOrder,columns: [columnId, memberName, customerPhone, productName, color, label],where: '$id = ?',whereArgs: [id]);if (result.length > 0) {return Order.fromSql(result.first);}return null;}Future<int> deleteNote(int id) async {var dbClient = await db;return await dbClient.delete(tableOrder, where: '$id = ?', whereArgs: [id]);}Future<int> updateNote(Order order) async {var dbClient = await db;return await dbClient.update(tableOrder, order.toJson(),where: "$orderNo = ?", whereArgs: [order.orderNo]);}Future close() async {var dbClient = await db;return dbClient.close();}
    }

    4.写一段json数据用于插入数据库

  • 5.应用

  • 先将本地json数据存入数据库

  • _saveOrderJson() async {var db = DatabaseHelper();String jsonStr = await DefaultAssetBundle.of(context).loadString("assets/json/order.json");List list = json.decode(jsonStr);List<Order> modelList = list.map((item) => Order.fromJson(item)).toList();modelList.forEach((v) => db.insertOrder(v));}

    根据数据库路径找到并打开数据库可以看到存入的数据

  • 除了遍历数组逐条插入还可以进行批量插入 使用batch

  • Future<List> batchInsertOrders(List<Order> orders) async {var dbClient = await db;//这里事务用不用都可以// Batch batch = dbClient.batch();//   orders.forEach((v) => batch.insert(tableOrder, v.toJson()));//   var result = await batch.commit();//   return result;await dbClient.transaction((txn) async {Batch batch = txn.batch();orders.forEach((v) => batch.insert(tableOrder, v.toJson()));var result = await batch.commit();return result;});}
  • 然后在取出数据库中的数据并展示的页面上

  • _getOrderFromDB() async {var db = DatabaseHelper();modelList = await db.selectAllOrders();print('model list count is ${modelList.length}');}

    这里添加了一个selectAllOrders的方法,就是执行了SELECT * FROM $tableOrder这句SQL

到此,数据库的实践使用就完成了。

flutter 数据持久化之sqflite相关推荐

  1. Flutter数据持久化

    前言 欢迎阅读Flutter系列教程,本文讲解Flutter的数据持久化.主要分三块内容: 1.使用Sqlite 2.读写文件 3.存储键值对 Sqlite的使用 如果你的APP需要经常在本地存储查询 ...

  2. Flutter知识点:数据存储之sqflite

    sqflite是一款轻量级的关系型数据库,类似SQLite. 在Flutter平台我们使用sqflite库来同时支持Android 和iOS. 使用介绍 1.首选需要在pubspec.yaml 导入库 ...

  3. Android数据持久化:SharePreference

    SharePreference:作为Android数据持久化的一种,具有一定的便捷性,适合存储一些体积小的数据. 存储数据方式:键值对的方式,类似于Map: 利用SharePreference.Edi ...

  4. Android数据持久化:文件存储

    数据持久化: 数据可分为瞬时数据和关键数据.保存在内存之中的数据是瞬时数据,而对于一些关键性数据,后期需要持续使用的,应当保存在存储设备中: 持久化保存方式: 文件存储.SharePreference ...

  5. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化

    遇到的问题 有的时候程序中需要全局皆可访问的变量,比如:用户是否登录,用户个人信息(用户名,地区,生日),或者一些其他信息如:是否是首次登录,是否需要显示新手引导等等. 其中有些数据需要持久化到本地硬 ...

  6. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框 ...

  7. Java 数据持久化系列之池化技术

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在上一篇文章Java 数据持久化系列之JDBC中,我们了解到使用 ...

  8. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别

    前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...

  9. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

最新文章

  1. 手把手,教你怎样用命令行给apk签名
  2. Nature盘点的这些代码,个个都改变了科学:Fortran、AlexNet还有arXiv等
  3. HDOJ 3732 Ahui Writes Word 多重背包
  4. swoole UDP TCP客户端
  5. java utf-8格式,JAVA编写文件格式转换UTF-8
  6. MySQL左连接还有过滤条件_MySQL左连接问题,右表做筛选,左表列依然在?
  7. 如何在vmvare vsphere(ESXI)中移除磁盘中的文件
  8. python语言训练教程_PYTHON零基础快乐学习之旅(K12实战训练)
  9. scala写入mysql_Scala:读写文件
  10. 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
  11. linux过滤某个mac的包,macOS 下使用 tcpdump 抓包
  12. 汉中市驾驶员理论模拟考试题
  13. 为 Electron / Atom Shell 设置应用icon(应用图标)
  14. html载入hta文件,浅谈HTA(HTML Application)和病毒的关系
  15. Swift 使用AVPlayer 和 AVPlayerItem 做语音播放
  16. CSS 实现鼠标移动到图片上图片变大
  17. 一个很实用的造数工具—Spawner Data Generator
  18. 使用Java+Puppeteer+OpenCV 过腾讯防水墙滑动验证码
  19. filecoin lotus 转账fil流程和gas计算
  20. 人脸识别的原理及技术

热门文章

  1. 企业级C++项目那些事(1):VSQt相关设置
  2. elastic search6聚合操作keyword
  3. 五大应用领域,三大前沿科技,大数据发展助力交通强国建设
  4. html列表圆点改色,在不使用span的情况下更改HTML列表的项目符号颜色
  5. php继承类如何触发父类中的构造函数,PHP 中类的继承和构造函数
  6. java初始化菜品信息_java食堂管理系统
  7. 图形学笔记(八)着色2 —— 纹理映射、重心坐标、双线性插值、Mipmap、三线性插值、各向异性过滤、纹理的应用(环境贴图、法线贴图等)
  8. 神经网络架构图片大全集,神经网络结构图绘制
  9. android 英文语言设置字体,Android中通过typeface设置字体-Go语言中文社区
  10. python分析微信好友签名分析