非常不错的三种存储,能够持久化存储和读取,指定路径后可以实现即使App卸载了一样数据还存储在用户的设备内,下次下载依然读取原数据,使用起来非常方便。
Flutter支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。若想使用这个功能需要引入官方仓库的相应插件,下面详细介绍这三种存储方式的使用方法。
Preferences
等同iOS的NSUserDefaults和Android的SharedPreferences。
导入插件
-
打开项目的pubspec.yaml配置,在dependencies节点下新增配置:
shared_preferences: ^0.4.1
- 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
-
在Dart文件中引入插件
import 'package:shared_preferences/shared_preferences.dart';
使用示例
setUserName() async{ SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(mUserName,"小明"); } getUserName() async{ SharedPreferences prefs = await SharedPreferences.getInstance(); userName = prefs.getString(mUserName); } displayUserName() { Future<String> userName = getUserName(); userName.then((String userName) { Scaffold.of(context).showSnackBar( SnackBar(content: Text("数据获取成功:$userName"))); }); }
文件存储
导入插件
-
打开项目的pubspec.yaml配置,在dependencies节点下新增配置:
path_provider: ^0.4.0
- 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
-
在Dart文件中引入插件
import 'package:path_provider/path_provider.dart';
使用示例
获取文件路径方法:
-
获取应用缓存目录: getTemporaryDirectory
- 类似iOS的NSTemporaryDirectory和Android的getCacheDir
-
获取应用文件目录: getApplicationDocumentsDirectory
- 类似iOS的NSDocumentDirectory和Android上的AppData目录
- 应用程序被删除时,系统会清除目录
-
存储卡: getExternalStorageDirectory
- 仅支持Android平台
// 找到正确的本地路径 Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; } // 创建对文件位置的引用 Future<File> get _localFile async { final path = await _localPath; return new File('$path/counter.txt'); } // 将数据写入文件 Future<File> writeCounter(int counter) async { final file = await _localFile; // Write the file return file.writeAsString('$counter'); } // 从文件中读取数据 Future<int> readCounter() async { try { final file = await _localFile; // Read the file String contents = await file.readAsString(); return int.parse(contents); } catch (e) { // If we encounter an error, return 0 return 0; } }
Sqfite
SQLite plugin for Flutter. Get the default databases location. On Android, it is typically data/data/<package_name>/databases, On iOS, it is the Documents directory.
导入插件
-
打开项目的pubspec.yaml配置,在dependencies节点下新增配置:
sqflite: ^1.0.0
- 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
-
在Dart文件中引入插件
import 'package:sqflite/sqflite.dart';
使用示例
// 获取数据库文件的存储路径 var databasesPath = await getDatabasesPath(); String path = join(databasesPath, 'demo.db'); // 创建数据库表 db = await openDatabase(path, version: 1, onCreate: (Database db, int version) async { await db.execute(''' CREATE TABLE $tableBook ( $columnId INTEGER PRIMARY KEY, $columnName TEXT, $columnAuthor TEXT, $columnPrice REAL, $columnPublishingHouse TEXT) '''); }); // 插入数据 Future<int> rawInsert(String sql, [List<dynamic> arguments]); Future<int> insert(String table, Map<String, dynamic> values, {String nullColumnHack, ConflictAlgorithm conflictAlgorithm}); // 查询数据 Future<List<Map<String, dynamic>>> rawQuery(String sql, [List<dynamic> arguments]); Future<List<Map<String, dynamic>>> query(String table, {bool distinct, List<String> columns, String where, List<dynamic> whereArgs, String groupBy, String having, String orderBy, int limit, int offset}); // 更新数据 Future<int> rawUpdate(String sql, [List<dynamic> arguments]); Future<int> update(String table, Map<String, dynamic> values, {String where, List<dynamic> whereArgs, ConflictAlgorithm conflictAlgorithm}); // 删除 Future<int> rawDelete(String sql, [List<dynamic> arguments]); Future<int> delete(String table, {String where, List<dynamic> whereArgs}); // 关闭数据库 Future close() async => db.close();
参考学习相关文章:
发表评论