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();
}

参考

相关推荐
2601_9495758614 小时前
JSON5 跨端三方库仓颉适配全流程
前端·javascript·flutter
法的空间14 小时前
AI 编程时代,为什么 Dart 分析会拖慢大型项目的开发
android·flutter·ios
恋猫de小郭16 小时前
Flutter 紧急发布 3.47.8 安全升级版本,建议都升级
android·前端·flutter
好的佩奇1 天前
Dart 之模式
android·flutter·dart
淡淡的香烟1 天前
Flutter实现多语言切换
android·flutter·1024程序员节
事圆则缓2 天前
从零搭建一套 Flutter 架构:先跑通数据流
flutter
程序员老刘2 天前
Flutter版本选择指南:3.44稳定了11周正式转正 | 2026年10月
flutter·ai编程·客户端
chicken_h3 天前
【无标题】
flutter·打包
事圆则缓3 天前
Flutter 底层渲染引擎怎么变了:从 Skia 到 Impeller,以及迁移时的坑
flutter
码林鼠3 天前
flutter状态管理入门教程-Riverpod
开发语言·javascript·flutter