数据库
1 | $ flutter pub add sqlite |
1 | $ flutter run |
运行失败,看是编译报错,打开Xcode工程 ⌘ + B 编译
对比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默认的Flutter工程默认未生成Podfile
然后查看 GSYGithubAppFlutter
1 | ... |
看代码是引入了Flutter提供的工具的,从flutter的安装目录下找到podhelper.rb这个文件
1 | # 方法: flutter_install_all_ios_pods |
1 | # 方法: flutter_install_plugin_pods |
1 | $ pod update --verbose |
因此Podfile
里的target部分就依赖了sqflite_darwin
1 | target 'Runner' do |
使用
打开/关闭/删除数据库
1 | import 'package:sqflite/sqflite.dart'; |
1 | /// 关闭数据库 |
1 | /// 删除数据库 |
1 | /// 添加表 |
使用SQL语句
1 | /// 添加数据 |
1 | /// 删除数据 |
1 | /// 更新数据 |
1 | /// 查询数据 |
使用工具方法
使用Sqflite提供的工具方法来执行数据库操作,而不是直接使用SQL语句
1 | import 'package:sqflite/sqflite.dart'; |
1 | void test() async { |
数据库迁移
随着功能迭代,需要对数据库的表结构进行修改时,比如增加新字段时,需要对表的结构进行更新。
1 | Future<Database?> open() async { |
1 | /// 4.添加description字段 |
1 | /// 调用 |
事务
数据库的增删改查可能会失败,导致数据与预期的不一致,为了保证在执行前后的数据一致性,引入了事务。事务具有ACID这4个特性:原子性、一致性、隔离性和持久性。
在事务中不要使用数据库,而只需要使用事务对象访问数据库。
1 | await database.transaction((txn) async { |
1 | try { |
批处理
使用 Batch,即批处理,来避免在 Dart 和原生代码之间的反复切换。
1 | batch = db.batch(); |
在事务中,批处理的commit会等到事务提交后
1 | await database.transaction((txn) async { |
1 | /// 设置批处理出现错误依然提交 |
表名和列名
SQLite的关键词,要避免使用作为实体(Entity)名。
1 | "add","all","alter","and","as","autoincrement","between","case","check","collate","commit","constraint","create","default","deferrable","delete","distinct","drop","else","escape","except","exists","foreign","from","group","having","if","in","index","insert","intersect","into","is","isnull","join","limit","not","notnull","null","on","or","order","primary","references","select","set","table","then","to","transaction","union","unique","update","using","values","when","where" |
sqflite的工具方法会进行处理,避免与关键字的冲突
1 | db.query('table') |
其它问题
VSCode 无法调试
Error connecting to the service protocol: failed to connect to http://127.0.0.1:51020/Kra7fZnYjeI=/ Error: Failed to register service methods on attached VM Service: registerService: (-32000) Service connection disposed
原来有成功过,后面发现一直都会有问题,前段时间突然不行,在长时间运行后就会报这个错误,但是单独在VSCode外部用flutter run命令能正常运行。
发现终端可以是把本地的端口转发的代理给去掉了。然后发现VSCode的代理有这样的说明,若未设置则会继承环境变量中的http_proxy
和https_proxy
,我把代理加到.zshrc
中,所以VSCode的默认会用代理,但是运行在真机上,手机没有代理,应该是这样影响了网络环境。
- .zshrc去掉代理的配置
- 重新打开VSCode && 运行 => 能正常调试