Flutter 教程(八)数据存储

shared_preferences

在 Flutter 中,我们可以使用 shared_preferences 来实现轻量级的数据存储。需要注意:shared_preferences在Android设备上是基于SharedPreferences开发的,而运行在iOS设备上是基于NSUserDefaults开发的。

导入 shared_preferences 库

首先,我们先添加依赖:

yaml 复制代码
dependencies:
  shared_preferences: ^2.5.3

然后在代码中引入对应的包,代码如下所示:

arduino 复制代码
import 'package:shared_preferences/shared_preferences.dart';

shared_preferences 的使用

  • 保存操作
vbscript 复制代码
SharedPreferences sharedPreferences=await SharedPreferences.getInstance();
sharedPreferences.setString("username", username);
sharedPreferences.setString("password", password);
  • 读取操作
ini 复制代码
SharedPreferences sharedPreferences=await SharedPreferences.getInstance();
sharedPreferences.get(keyString);
  • 删除操作
ini 复制代码
SharedPreferences sharedPreferences=await SharedPreferences.getInstance();
sharedPreferences.remove(keyString);
  • 清空操作
ini 复制代码
SharedPreferences sharedPreferences=await SharedPreferences.getInstance();
sharedPreferences.clear();

文件存储

在 Flutter 中,如果我们想要操作App目录或者SD文件夹中的文件,则需要使用 path_provider 库。我们都知道在Android和iOS下,临时目录、文档目录都是不同的。而 path_provider 库提供了统一的接口,能够获取手机上的常用目录,如临时目录、文档目录等,从而方便程序存储和访问指定目录下的文件。

导入 path_provider 库

首先我们先添加依赖

yaml 复制代码
dependencies:
  path_provider: ^2.1.5

然后在代码文件中 import 对应的包

arduino 复制代码
import 'package:path_provider/path_provider.dart';

path_provider 的使用

  • 获取临时文件目录
ini 复制代码
_getTempFileDir() async{
  Directory tempDir=await getTemporaryDirectory();
  String tempPath=tempDir.path;
}
  • 获取SD卡外部存储目录
ini 复制代码
_getSDFileDir() async{
    Directory sdFileDir=await getExternalStorageDirectory();
    String sdFileDirPath=sdFileDir.path;
}

注意:在iOS中,没有外部存储目录的概念,也就是没有SD卡外部存储目录。所以在实际的开发中,读者需要先判断系统,再做出适当的更改。

sqflite

SQLite是一款轻量级的数据库,是手机最常用的一种数据存储方式。在Flutter项目中,如果需要对数据进行大批量的增删改查的操作,就会用到SQLite数据库。Flutter专门提供了操作SQLite数据库的sqflite库。

导入 sqflite 库

首先我们添加依赖:

yaml 复制代码
dependencies:
  sqflite: ^2.4.2

然后在代码文件中 import 对应的包

arduino 复制代码
import 'package:sqflite/sqflite.dart';

sqflite 的使用

  • 获取数据库的路径
ini 复制代码
_getDatabasePath() async{
    var databasePath=await getDatabasesPath();
    String path=join(databasePath,'demo.db');
    print(path);
}
  • 打开SQLite数据库并创建表
ini 复制代码
_openDatabaseAndCreateTable()async{
  var databasePath=await getDatabasesPath();
  String path=join(databasePath,'demo.db');
  Database database=await openDatabase(
    path,
    version: 1,
    onCreate: (Database db,int version)async{
      await db.execute(
        'CREATE TABLE User(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)',
      );
    }
  );
}
  • 数据库插入操作
ini 复制代码
// 使用 rawInsert 插入
_rawInsertData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    int id1 = await txn.rawInsert(
        'INSERT INTO User(name, age) VALUES(?, ?)',['Liyuanjing',27]);
    print('inserted1: $id1');
  });
}
// 使用 insert 插入
_insertData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  Map<String,dynamic> values={
    'name':'zhangsan',
    'age': 24,
  };
  await database.insert('User', values);
}
  • 数据库更新操作

和上面的查找操作类似,更新操作也有两种方法:rawUpdate 和 update。代码示例如下:

dart 复制代码
_rawUpdateData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    int id1 = await txn.rawUpdate(
        'UPDATE User SET name=? WHERE age=?',["Batman",27]);
    print('inserted1: $id1');
  });
}

_updateData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    Map<String,dynamic> values={
      'name':'SpiderMan',
    };
    int id1 = await txn.update('User',values,where: 'age=?',whereArgs: [27,]);
    print('inserted1: $id1');
  });
}
  • 数据库查询操作
dart 复制代码
_rawQueryData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    List<Map<String,dynamic>> list = await txn.rawQuery(
        'SELECT * FROM User WHERE age=?',[27]);
    print(list);
  });
}

_queryData() async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    List<Map<String,dynamic>> list = await txn.query('User',where: 'age=?',whereArgs:
        [27,]);
      print(list);
  });
}
  • 数据删除操作
ini 复制代码
_rawDeleteData()async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    int id = await txn.rawDelete('DELETE FROM User WHERE age = ?', [24,]);
    print("$id");
  });
}

_deleteData()async{
  var databasesPath=await getDatabasesPath();
  String path=join(databasesPath,'demo.db');
  Database database=await openDatabase(path,version:1,);
  database.transaction((txn) async{
    int id = await txn.delete('User',where: 'age=?',whereArgs: [27,]);
    print("$id");
  });
}
  • 其他
scss 复制代码
// 删除数据库
_deleteDatabase() async{
  var databasePath=await getDatabasesPath();
  String path=join(databasePath,'demo.db');
  await deleteDatabase(path);
}

// 关闭数据库
_closeDatabase() async{
  await database.close();
}

参考

相关推荐
LawrenceLan20 小时前
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
开发语言·flutter·dart
一豆羹21 小时前
macOS 环境下 ADB 无线调试连接失败、Protocol Fault 及端口占用的深度排查
flutter
行者9621 小时前
OpenHarmony上Flutter粒子效果组件的深度适配与实践
flutter·交互·harmonyos·鸿蒙
行者961 天前
Flutter与OpenHarmony深度集成:数据导出组件的实战优化与性能提升
flutter·harmonyos·鸿蒙
小雨下雨的雨1 天前
Flutter 框架跨平台鸿蒙开发 —— Row & Column 布局之轴线控制艺术
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨1 天前
Flutter 框架跨平台鸿蒙开发 —— Center 控件之完美居中之道
flutter·ui·华为·harmonyos·鸿蒙
小雨下雨的雨1 天前
Flutter 框架跨平台鸿蒙开发 —— Icon 控件之图标交互美学
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨1 天前
Flutter 框架跨平台鸿蒙开发 —— Placeholder 控件之布局雏形美学
flutter·ui·华为·harmonyos·鸿蒙系统
行者961 天前
OpenHarmony Flutter弹出菜单组件深度实践:从基础到高级的完整指南
flutter·harmonyos·鸿蒙
前端不太难1 天前
Flutter / RN / iOS,在长期维护下的性能差异本质
flutter·ios