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

参考

相关推荐
WDeLiang21 小时前
Flutter - 集成三方库:数据库(sqflite)
数据库·flutter·dart
程序猿阿伟2 天前
《社交应用动态表情:RN与Flutter实战解码》
javascript·flutter·react native
明似水2 天前
Flutter 开发入门:从一个简单的计数器应用开始
前端·javascript·flutter
周胡杰2 天前
组件导航 (Navigation)+flutter项目搭建-混合开发+分栏
数码相机·flutter·华为·电脑·harmonyos·鸿蒙
初遇你时动了情2 天前
flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
flutter
初遇你时动了情3 天前
flutter 配置 安卓、Ios启动图
android·flutter·ios
程序猿阿伟3 天前
《云端共生体:Flutter与AR Cloud如何改写社交交互规则》
flutter·ar·交互
lpfasd1233 天前
Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析
flutter·kotlin·harmonyos
WDeLiang3 天前
Flutter - UIKit开发相关指南 - 线程和异步
flutter·ios·dart
TE-茶叶蛋4 天前
Uniapp、Flutter 和 React Native 全面对比
flutter·react native·uni-app