Flutter 核心技术与实战
陈航
前美团点评高级技术专家
42432 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
Flutter 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

25 | 本地存储与数据库的使用和优化

递增写入SharedPreferences中的值
读取SharedPreferences中的值
读文件函数
写文件函数
创建文件目录函数
数据库升级代码
读取数据
插入数据
创建数据库
适用场景
例子演示
适用场景
例子演示
文档目录
临时目录
数据库
SharedPreferences
文件
Flutter应用数据持久化

该思维导图由 AI 生成,仅供参考

你好,我是陈航。
在上一篇文章中,我带你一起学习了 Flutter 的网络编程,即如何建立与 Web 服务器的通信连接,以实现数据交换,以及如何解析结构化后的通信信息。
其中,建立通信连接在 Flutter 中有三种基本方案,包括 HttpClient、http 与 dio。考虑到 HttpClient 与 http 并不支持复杂的网络请求行为,因此我重点介绍了如何使用 dio 实现资源访问、接口数据请求与提交、上传及下载文件、网络拦截等高级操作。
而关于如何解析信息,由于 Flutter 并不支持反射,因此只提供了手动解析 JSON 的方式:把 JSON 转换成字典,然后给自定义的类属性赋值即可。
正因为有了网络,我们的 App 拥有了与外界进行信息交换的通道,也因此具备了更新数据的能力。不过,经过交换后的数据通常都保存在内存中,而应用一旦运行结束,内存就会被释放,这些数据也就随之消失了。
因此,我们需要把这些更新后的数据以一定的形式,通过一定的载体保存起来,这样应用下次运行时,就可以把数据从存储的载体中读出来,也就实现了数据的持久化
数据持久化的应用场景有很多。比如,用户的账号登录信息需要保存,用于每次与 Web 服务验证身份;又比如,下载后的图片需要缓存,避免每次都要重新加载,浪费用户流量。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Flutter应用中数据持久化的重要性以及三种数据持久化方法:文件、SharedPreferences和数据库。文件存储适合大量有序数据的持久化,而SharedPreferences适用于少量键值对信息的缓存。文章详细介绍了在Flutter中如何使用这些方法进行数据的读写操作,并提供了相应的代码示例。特别强调了异步环境下进行文件读写操作的重要性,以及在使用SharedPreferences时需要注意只能存储基本数据类型。对于数据库的使用方法也进行了详细介绍,包括创建数据库、写入和读取数据等操作。通过本文的总结,读者可以快速了解Flutter应用中数据持久化的重要性以及如何使用文件、SharedPreferences和数据库进行数据持久化操作。文章还留下了两道思考题,引发读者思考和讨论。整体而言,本文内容丰富,涵盖了Flutter应用中数据持久化的方方面面,对读者进行了全面的指导和启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Flutter 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • Geek_joestar
    1.1 版本及 1.2 版本的数据库升级代码: final Future<Database> database = openDatabase( join(await getDatabasesPath(), 'students_database.db'), onCreate: (db, version) => db.execute( "CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"), onUpgrade: (db, oldVersion, newVersion) { //dosth for migration print("old:$oldVersion,new:$newVersion"); switch (oldVersion) { case 1: db.execute("ALTER TABLE students ADD age INTEGER"); } }, version: 2, );

    作者回复: 对,不过switch-case是需要有break的

    2019-09-09
    3
  • 许童童
    思考题: 1.文件用来存储图片,视频类的大文件,SharedPreferences 用来存储一些键值对,比如记住用户名,数据库用来存储类似表格有关系的数据行。 2. //1.1 版本数据库创建代码 final Future<Database> database = openDatabase( join(await getDatabasesPath(), 'students_database.db'), onCreate: (db, version)=> { if (version == '1.0') { db.execute("ALTER TABLE students ADD age INTEGER)"), } else { db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"), } } version: 1, ); //1.2 版本数据库创建代码 final Future<Database> database = openDatabase( join(await getDatabasesPath(), 'students_database.db'), onCreate: (db, version)=> { if (version == '1.0') { db.execute("ALTER TABLE students ADD age INTEGER)"), } else if (version == '1.1') { } else { db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"), } } version: 1, );

    作者回复: 数据库创建的语句不对: 1.1.0,1.1和1.2传入的version完全一样,没办法区分数据库版本 2.数据库升级的代码不太适合用if-else判断具体版本去写适配策略,版本一多适配代码就乱了。建议用none break的switch-case去写

    2019-08-24
    2
  • ptlCoder
    数据库升级应该要比较两个版本的字段,防止数据丢失应该把旧的字段值拷贝到新的版本中

    作者回复: 数据量大的话不建议拷贝,建议直接在原始表上新增字段

    2019-08-29
    1
  • 汪帅
    我想请问一下关于获取系统信息怎么做啊?例如通讯录,安装的APP信息等等

    作者回复: 需要在原生代码宿主写方法通道来实现了。具体可以参考26节的内容

    2019-08-24
    4
    1
  • coc
    getApplicationDocumentsDirectory找不到这方法

    作者回复: import 'package:path_provider/path_provider.dart';

    2019-12-16
  • Geek_neterM
    老师,是不是我本地没有content.txt,一直报 no such file or directory

    作者回复: 检查一下你的路径名是不是和例子一样哈

    2019-09-09
  • Geek_neterM
    老师,是不是实现必须把content.txt 创建好呀。

    作者回复: 不需要的

    2019-09-09
  • 小水滴
    final Future<Database> database_1v = openDatabase( join(await getDatabasesPath(),'students_database.db'), onCreate: (db,version)=>db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER)"), version: 1 ); //1.1版本 final Future<Database> database_11v = openDatabase( join(await getDatabasesPath(),'students_database.db'), onCreate: (db,version) { switch(version){ case 1: db.execute("ALTER TABLE students ADD age INTEGER)"); break; default: db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER"); } }, version: 11 ); //1.1版本 final Future<Database> database_12v = openDatabase( join(await getDatabasesPath(),'students_database.db'), onCreate: (db,version) { switch(version){ case 1: db.execute("ALTER TABLE students ADD age INTEGER)"); break; case 11: break; default: db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER"); } }, version: 12 );

    作者回复: 这里有一个bug:你这里的switch-case只能执行单条更新语句,如果数据库版本差的比较多,每个版本都有更新,这样就不行了 另外更正一个原文中的错误:数据库的升级是在onUpgrade回调函数中完成的

    2019-08-28
  • davidzhou
    老师,flutter的sqlite有没有ORM的相关第三方库

    作者回复: pub上有一些,没有特别好用的,不建议

    2019-08-26
  • Geek_061196
    数据库升级 推荐使用 sqflite_migration插件进行版本管理
    2022-01-06
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部