25 | 本地存储与数据库的使用和优化
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Flutter应用中数据持久化的重要性以及三种数据持久化方法:文件、SharedPreferences和数据库。文件存储适合大量有序数据的持久化,而SharedPreferences适用于少量键值对信息的缓存。文章详细介绍了在Flutter中如何使用这些方法进行数据的读写操作,并提供了相应的代码示例。特别强调了异步环境下进行文件读写操作的重要性,以及在使用SharedPreferences时需要注意只能存储基本数据类型。对于数据库的使用方法也进行了详细介绍,包括创建数据库、写入和读取数据等操作。通过本文的总结,读者可以快速了解Flutter应用中数据持久化的重要性以及如何使用文件、SharedPreferences和数据库进行数据持久化操作。文章还留下了两道思考题,引发读者思考和讨论。整体而言,本文内容丰富,涵盖了Flutter应用中数据持久化的方方面面,对读者进行了全面的指导和启发。
《Flutter 核心技术与实战》,新⼈⾸单¥59
全部留言(17)
- 最新
- 精选
- Geek_joestar1.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-093 - 许童童思考题: 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-242 - ptlCoder数据库升级应该要比较两个版本的字段,防止数据丢失应该把旧的字段值拷贝到新的版本中
作者回复: 数据量大的话不建议拷贝,建议直接在原始表上新增字段
2019-08-291 - 汪帅我想请问一下关于获取系统信息怎么做啊?例如通讯录,安装的APP信息等等
作者回复: 需要在原生代码宿主写方法通道来实现了。具体可以参考26节的内容
2019-08-2441 - cocgetApplicationDocumentsDirectory找不到这方法
作者回复: 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