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

参考

相关推荐
张风捷特烈8 分钟前
Flutter 伪3D绘制#03 | 轴测投影原理分析
android·flutter·canvas
马拉萨的春天3 小时前
flutter 项目结构目录以及pubspec.ymal等文件描述
flutter
bst@微胖子19 小时前
Flutter项目之登录注册功能实现
开发语言·javascript·flutter
小墙程序员21 小时前
Flutter 教程(十一)多语言支持
flutter
无知的前端1 天前
Flutter 一文精通Isolate,使用场景以及示例
android·flutter·性能优化
yidahis1 天前
Flutter 运行新建项目也报错?
flutter·trae
木马不在转1 天前
Flutter-权限permission_handler插件配置
flutter
江上清风山间明月1 天前
一周掌握Flutter开发--9. 与原生交互(下)
flutter·交互·原生·methodchannel
GeniuswongAir1 天前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
sayen1 天前
记录 flutter 文本内容展示过长优化
前端·flutter