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

参考

相关推荐
君赏13 分钟前
Petrel(雨燕)Flutter 热更新如何在我们项目应用
flutter
JulyYu2 小时前
Flutter混合栈适配安卓ActivityResult
android·flutter
海的天空16616 小时前
Flutter旧版本升级-> Android 配置、iOS配置
android·flutter·ios
小蜜蜂嗡嗡6 小时前
【flutter对屏幕底部有手势区域(如:一条横杠)导致出现重叠遮挡】
前端·javascript·flutter
ai_xiaogui17 小时前
反催收APP开发思路:用Flutter打造证据链管理工具
flutter·反催收app开发·flutter证据链管理·跨平台维权工具
木子雨廷19 小时前
Flutter 开发一个plugin
前端·flutter
苦逼的搬砖工19 小时前
Network Kit Lite:一个基于 SOLID 原则的 Flutter 网络框架架构设计
flutter
苦逼的搬砖工21 小时前
Flutter 基础组件深度解析:从入门到精通
flutter
苦逼的搬砖工1 天前
Flutter 其他组件:让交互更丰富
flutter
苦逼的搬砖工1 天前
Flutter PageView 页面视图深度解析:从基础到高级
flutter