Flutter学习总结(十八、Flutter的数据持久化)

Flutter的数据持久化

一起从0开始学习Flutter!

在移动端存储数据我们有多种方法有sharePreferences,SQLite,本地文件,网络存储这几种方法,后面的两种在前面的文章中有部分介绍,这里不多做说明,这篇主要是跟大家一起来学习sharePreferences,SQLite。

sharePreference

这个在原来安卓的开发中经常用到,来看下在Flutter中是否还是我们原来熟悉的sharePreference么。
首先介绍一下sharePreference的使用,由于是第三方库我们先将它引入到我们项目中:

dependencies:
  shared_preferences: ^0.5.7

引入完成后我们可以在使用时import该类库

import 'package:shared_preferences/shared_preferences.dart';

引入完成我们就可以进行使用了,先从常规的增删改查来看下:
增:

//在实例化的时候需要读取本地已经持久化的数据来读到内存中,有可能会耗时比较多,这里它采用了异步的方式,所以需要加await关键字,在引用它的方法声明上添加async关键字
SharedPreferences sharePerence = await SharedPreferences.getInstance();
sharePerence.setString("key1", "value1");
//这里存储了一个字符串,还可以存储其他类型的数据:
sharePerence.setBool(key, value);
sharePerence.setDouble(key, value);
sharePerence.setInt(key, value);
sharePerence.setStringList(key, value);

删:

sharePerence.remove(key);//删除比较简单

改:
改的方法同增加的方式,如果发现了重复的key则会对原来的值进行覆盖。
查:

sharePerence.containsKey(key);//是否包含指定key的值

它是怎么在本地进行存储的呢?它会生成一个xml放置到本地的沙盒中,打开里面看到存储的数据结构是:

<map>
    <string name="flutter.key1">value1</string>
</map>

也就是说我们所有的shareperfence都是存储在这一个xml中的,联想到xml的读取和写入方式,在存储到大量的数据后读取速度就会有比较大的影响,这里不建议存放过多的数据。

SQLite

存储大量数据的时候它就比较合适了,我们可以看下它是如何帮我们存储大量的数据的。
我们先引入SQLite的第三方库:

dependencies:
  sqflite: ^1.3.0

在需要使用的地方import该类库:

import 'package:sqflite/sqflite.dart';

完成引用后就可以开始使用了,先看下如何操作一个数据库,直接使用openDatabase方法就可以直接打开一个数据库,一起看下如何创建和升级表:

Future<Database> openDatabase(String path,//需要打开的数据库名称
    {int version,//最新的数据库版本
    OnDatabaseConfigureFn onConfigure,//参照下面的详解
    OnDatabaseCreateFn onCreate,//参照下面的详解
    OnDatabaseVersionChangeFn onUpgrade,//参照下面的详解
    OnDatabaseVersionChangeFn onDowngrade,//参照下面的详解
    OnDatabaseOpenFn onOpen,//参照下面的详解
    bool readOnly = false,//是否是只读模式
    bool singleInstance = true})//是否数据库是单例的,如果是单例的我们传入地址是一个的时候则会返回刚刚实例的数据库
onConfigure

在回调onCreate/onUpdate/onOpen之前会调用该方法,我们可以在这里做一些初始化的工作。onConfigure的类型为OnDatabaseConfigureFn,我们看下OnDatabaseConfigureFn是什么:

typedef OnDatabaseConfigureFn = FutureOr<void> Function(Database db);//这里我们需要传入一个带有Database参数的函数来处理初始需要做的事情
onCreate

在完成了onConfigure的回调后开始调用OnCreate方法,在这里我们可以创建表,还是看下OnDatabaseCreateFn是什么:

typedef OnDatabaseCreateFn = FutureOr<void> Function(Database db, int version);//这里我们需要一个传入一个带有DataBase和version的函数来处理初始化,可以根据version来创建表

我们先在这步进行一个数据库的创建为了以后我们好看接下里的实例:

onCreate: (dataBase, version) {
      dataBase.execute("create table my_table (id integer primary key,username text,password text)");//创建一个my_table的表
    }
onUpgrade

在版本号我们更新了以后会调用onUpgrade的方法,如果发生了表内字段的变更我们可以在这里根据版本号进行判断,针对不同的版本设定字段更新语句。看下OnDatabaseVersionChangeFn是什么:

typedef OnDatabaseVersionChangeFn = FutureOr<void> Function(
    Database db, int oldVersion, int newVersion);//这里我们需要一个传入一个带有DataBase、oldversion和newVersion的函数来处理初始化,可以根据oldVersion,newVersion来修改表结构
onDowngrade

如果出现newVersion低于了oldVersion的版本会调用onDowngrade的方法,调用的时候可以根据降级的版本进行数据表的恢复。传入的也是OnDatabaseVersionChangeFn,可以参照上面的。
打开了一个数据库之后我们就可以对数据库进行操作了,我们还是从常规的增删改查来看下:
增:

dataBase.execute(
          "insert into my_table(username,password) values(?,?);",["flutter","pwd1"]);//增加一条数据

删:

int deleteCount = await dataBase.rawDelete("delete from my_table where username=?",["flutter"]);//返回影响的行数

改:

int updateCount = await dataBase.rawUpdate("update my_table set password = ? where username = ?",["pwd2","flutter"]);//返回影响的行数

查:

List<Map> dataList = await dataBase.rawQuery("select * from my_table where username= ?",["flutter"]);//返回所有的查询结果,以刚刚的插入数据的SQL为例,返回的结果为:[{id: 1, username: flutter, password: pwd1}]

在我们使用完数据库之后一定要记得关闭数据库,避免资源的浪费,关闭数据库:

dataBase.close();

如果我们想要删除一个表就可以根在OnCreate里的操作一样使用execute方法:

dataBase.execute("drop table my_table");

如果我们想要执行多条数据库指令,需要使用到SQL中的事务来帮助我们保证数据的一致性:

 dataBase.transaction((txn) async {
        var batch = txn.batch();
        batch.rawInsert("insert into my_table(username,password) values(?,?)",["flutter1","pwd2"]);
        batch.rawInsert("insert into my_table(username,password) values(?,?)",["flutter2","pwd3"]);
        batch.rawInsert("insert into my_table(username,password) values(?,?)",["flutter3","pwd4"]);
        batch.commit(noResult: true);//一并插入三条数据,并不需要返回结果
      });

数据库的基本操作就介绍完了,在实际使用的过程中这样的使用是不太符合我们日常习惯的,最好还是根据面向对象的方式将增删改查的方式封装到对象里。

接下来我们来一起学习Flutter的Json解析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值