Flutter 进阶: 持久化 sqflite

2,010 阅读1分钟

flutter数据状态持久化,通常可以使用:

  • shared_preferences:使用相对简单,将数据用键值对的形式,以文件的方式存在设备本地,非常类似于浏览器中localstorage
  • sqflite:需要完整的本地数据库实现

code

database

封装一个sqflite类,实现增删改查数据库功能

import 'package:sqflite/sqflite.dart';

class SqlLite {
  final sqlFileName = "bonfire.sql"; // sql数据文件
  final userState = "userState"; // 用户状态
  Database db; //后面使用 db缩写 表示 Database
  // 建立一个开启数据库的方法
  open() async {
    String path = "${await getDatabasesPath()}/$sqlFileName";
    if (db == null) {
      db = await openDatabase(path, version: 1, onCreate: (db, ver) async {
        // 用户状态:welComeTimes 打开bonfire次数
        await db.execute("""
        Create Table userState(
         welComeTimes int,
         code int
        );
        """);
        await db.insert("userState", {'welComeTimes': 0,'code': 200});
      });
    }
  }

  // 读取userState表全部数据
  queryUserState() async {
    return await db.query(userState, columns: null);
  }

  //
  insertUserState(Map<String,dynamic> m) async {
    return await db.update(userState, m);
  }
}

use

例子,使用sqlfite实现首次打开app进入欢迎/引导页

import 'package:flutter_module/database/sqflite.dart';
final _sqlite = SqlLite();   
 // 开启数据表
await _sqlite.open();
print(await _sqlite.queryUserState());
// 首次使用,打开欢迎
List<Map<String,dynamic>>  result = await _sqlite.queryUserState();
if (result[0]['code'] == 200) {
  if (result[0]['welComeTimes'] == 0) {
    _sqlite.insertUserState({"welComeTimes": result[0]['welComeTimes']+1});
    return Navigator.of(context).push(SlideInFromBottomRoute(Welcome()));
  } else {
    return Navigator.of(context).push(SlideInFromBottomRoute(Waiting()));
  }
}