Flutter仅接管了渲染层,涉及到存储等操作系统底层的行为,还是需要依托于原生平台的特性。Flutter与原生开发类似,支持三种数据持久化的方式,即文件存储、SharedPreferences和数据库。
文件
文件存储是存放在磁盘的指定路径上的一组信息集合。Flutter提供了两种文件存储的目录,即临时目录(Temporary)和文档目录(Documents)。
临时存储目录(Temporary)是操作系统可以随时清除的目录,通常被用来存储一些不重要的临时缓存数据。在IOS上对应着NSTemporaryDirectory返回的路径,在Android上对应着getCacheDir返回的路径;
文档存储目录(Documents)只有在删除应用程序的时候才会被清除的文件目录,通常用来存储一些重要的文件数据。在IOS上对应着NSDocumentDirectory返回的路径,在Android上对应着AppData目录。
有上面的操作,我们就可以直接读写文件:
// 写文件writeContent("Hello World!");// 读取文件readContent().then((content) =>print(content));varcontent =awaitreadContent();
除了字符串的读取,Flutter还提供了二进制的读写,支持图片、压缩包等以二进制流的方式读写文件,读写的方式可以参考:
SharedPreferences
如果我们只需要缓存少量的键值数据,则可以使用SharedPreferences。Flutter的SharedPreferences存储会调用平台相关的特性进行数据持久化存储,在IOS平台使用NSUserDefaults,在Android平台使用SharedPreferences。
【注意】与Android的SharedPreferences不同的是,Flutter在设置的时候仅需调用setter方法就同步内存和磁盘中的键值对数据,无需在调用刷新数据的操作。
调用上面的方法进行SharedPreferences数据读写:
【注意】SharedPreferences只能存储基本数据类型,比如int、double、bool和string。
数据库
当我们有大量高频读写的数据,就需要使用sqlite数据库进行数据持久化存储。接下来的例子介绍如何在Flutter中使用数据库读写。
数据库的读写一般会用到对象类,下面以Student对象类为例:
接下来需要创建数据库,我们可以通过openDatabase函数获得一个数据库存储地址,通过数据库表初始化语句创建一个存放数据的表:
上面的代码创建了数据库,需要注意的是:
使用join的方法声明数据库路径,可以将两个地址拼接在一起,join函数会按照当前操作系统的路径分割符,将前后两端路径进行拼接,我们无需关心分隔符是使用\还是/。
在创建数据库的时候,openDatabase中需要传入一个参数version,这个参数是最新的数据库版本号,在onCreate回调函数中同时也会也有一个version(上面代码中的localDBVersion),这个version是用户手机上使用的数据库版本号,我们可以通过这两个版本号定制化的做一些数据库更新的操作。比如,version = 2的时候,student表结构发生了不可逆的改变,为了后续数据的读写,之前的数据必须首先被删除,那么我们可以在onCreate函数中,判断localDBVersion,从而进行student表的删除,并重新创建。
数据库插入:
数据库的读取:
sqlite还提供了更新、删除、事务等高级特性,更多的方法可以查看: