Flutter 应用数据持久化指南

1. 介绍

1.1 什么是数据持久化?

数据持久化是指将应用程序中的数据保存在持久存储介质(如硬盘、数据库等)中的过程。在计算机科学领域,持久化数据是指数据在程序退出或系统关机后仍然存在的能力。这种持久性使得数据可以在不同的应用程序运行周期之间保持不变,以便稍后进行检索、处理和使用。

在移动应用开发中,数据持久化是指将应用程序中的用户数据(如用户偏好设置、用户登录状态、应用配置等)保存在设备上,以便在应用关闭或设备重启后仍然保持。这样可以确保用户在不同的应用使用场景中,其数据状态可以得到保留和恢复。

1.2 为什么在Flutter应用中需要数据持久化?

在Flutter应用中,数据持久化是一项至关重要的任务,这是因为:

  1. 用户体验改善: 持久化数据可以确保用户的个性化设置、历史数据、登录状态等在应用关闭或重启后得以保留,提升了用户体验。

  2. 应用状态管理: 应用中的状态数据(如购物车内容、用户设置)可能需要在应用生命周期中保持不变,以确保应用的连续性和一致性。

  3. 离线支持: 某些应用场景下,用户可能会在没有网络连接的情况下使用应用,此时需要将数据持久化到本地以提供离线支持。

  4. 数据共享: 持久化数据可以使得不同的模块或组件之间共享数据更加方便,同时也可以实现跨设备的数据同步。

因此,数据持久化在Flutter应用中扮演着至关重要的角色,它不仅可以改善用户体验,还可以提高应用的可靠性和灵活性。

在这里插入图片描述

2. Flutter中的数据持久化方式

2.1 Shared Preferences

Shared Preferences是Flutter中用于轻量级数据存储的一种方式,它允许将简单的键值对保存到设备上的持久化存储中。通常用于存储用户的偏好设置、配置信息等。

优点:

  • 简单易用,不需要额外的依赖库。
  • 适用于存储少量的简单数据。
  • 跨应用共享数据。

缺点:

  • 仅适用于存储简单的键值对数据,不适合存储复杂数据结构。
  • 不支持查询操作,只能通过键获取值。

2.2 SQLite数据库

SQLite是一种轻量级的关系型数据库,Flutter提供了SQLite数据库的支持,可以通过dart语言的sqflite库进行操作。SQLite适用于需要存储大量结构化数据的情况。

优点:

  • 支持复杂的查询操作,适用于存储和管理大量结构化数据。
  • 数据库的持久化存储,适用于需要长期保存数据的应用场景。

缺点:

  • 使用相对较复杂,需要熟悉SQL语法。
  • 需要引入第三方库(如sqflite)来实现数据库操作。

2.3 文件存储(File Storage)

Flutter也支持直接将数据存储到文件中,可以通过dart语言的File类进行文件操作。文件存储适用于存储非结构化或半结构化的数据,如图片、文本等。

优点:

  • 灵活性高,可以存储各种类型的数据。
  • 适用于存储大文件或非结构化数据。

缺点:

  • 需要手动管理文件的读写操作,相对麻烦。
  • 不适合存储大量结构化数据,查询和操作相对复杂。

2.4 使用第三方库

除了上述原生的数据持久化方式外,Flutter还有许多第三方库可供选择,如Hive数据库、ObjectBox等。这些库提供了不同的特性和性能优化,可以根据具体需求选择最合适的库进行数据持久化操作。

优点:

  • 提供了丰富的功能和性能优化。
  • 可以根据需求选择最合适的库。

缺点:

  • 引入第三方库可能增加应用的体积。
  • 学习成本相对较高,需要熟悉库的使用方法和特性。

3. Shared Preferences

3.1 安装与导入

在Flutter项目中使用Shared Preferences,首先需要在项目的pubspec.yaml文件中添加依赖,并运行flutter pub get命令来安装依赖包。

dependencies:
  shared_preferences: ^2.0.0

安装完成后,在需要使用的Dart文件中导入shared_preferences库。

import 'package:shared_preferences/shared_preferences.dart';

3.2 使用示例

下面是一个简单的示例,演示了如何使用Shared Preferences在Flutter应用中存储和读取数据。

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  
  void initState() {
    super.initState();
    _loadCounter();
  }

  _loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0);
    });
  }

  _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0) + 1;
      prefs.setInt('counter', _counter);
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shared Preferences Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Button tapped $_counter time${_counter == 1 ? '' : 's'}.',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

3.3 优缺点

优点:

  • 简单易用,不需要额外的依赖。
  • 跨应用共享数据,可以在应用之间共享用户偏好设置等信息。
  • 适用于存储少量的简单数据,如用户设置、配置信息等。

缺点:

  • 仅适用于存储简单的键值对数据,不适合存储复杂数据结构。
  • 不支持查询操作,只能通过键获取值。
  • 存储的数据量有限,不适合存储大量数据。

4. SQLite 数据库

4.1 安装与导入

在Flutter项目中使用SQLite数据库,需要添加sqflite依赖,并运行flutter pub get来安装依赖包。

dependencies:
  sqflite: ^2.0.0
  path_provider: ^2.0.0

安装完成后,在需要使用的Dart文件中导入sqflite库。

import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';

4.2 使用示例

下面是一个简单的示例,演示了如何使用SQLite数据库在Flutter应用中创建表格、插入数据、查询数据等操作。

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Database _database;

  
  void initState() {
    super.initState();
    _openDatabase();
  }

  _openDatabase() async {
    final Directory directory = await getApplicationDocumentsDirectory();
    final String path = join(directory.path, 'example.db');
    _database = await openDatabase(path, version: 1,
        onCreate: (Database db, int version) async {
      await db.execute(
          'CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY, name TEXT)');
    });
  }

  _insertData() async {
    await _database.transaction((txn) async {
      int id = await txn.rawInsert(
          'INSERT INTO items(name) VALUES("Item 1")');
      print('Inserted row id: $id');
    });
  }

  _queryData() async {
    List<Map> result = await _database.rawQuery('SELECT * FROM items');
    print(result);
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SQLite Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _insertData,
              child: Text('Insert Data'),
            ),
            ElevatedButton(
              onPressed: _queryData,
              child: Text('Query Data'),
            ),
          ],
        ),
      ),
    );
  }
}

4.3 优缺点

优点:

  • 支持复杂的查询操作,适用于存储和管理大量结构化数据。
  • 数据库的持久化存储,适用于需要长期保存数据的应用场景。
  • 提供了事务管理,可以确保数据的一致性和完整性。

缺点:

  • 使用相对较复杂,需要熟悉SQL语法。
  • 需要引入第三方库(如sqflite)来实现数据库操作。
  • 对于简单的数据存储需求,使用SQLite可能显得过于复杂。

5. 文件存储

5.1 安装与导入

在Flutter项目中使用文件存储,无需额外安装依赖,因为文件操作相关的库已经包含在Flutter SDK中。

5.2 使用示例

下面是一个简单的示例,演示了如何使用文件存储在Flutter应用中读取和写入数据。

import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _filePath = '';

  
  void initState() {
    super.initState();
    _getFile();
  }

  Future<void> _getFile() async {
    Directory directory = await getApplicationDocumentsDirectory();
    _filePath = '${directory.path}/example.txt';
  }

  Future<void> _writeToFile() async {
    final File file = File(_filePath);
    await file.writeAsString('Hello, Flutter!');
    print('Data written to file.');
  }

  Future<void> _readFromFile() async {
    try {
      final File file = File(_filePath);
      String data = await file.readAsString();
      print('Data read from file: $data');
    } catch (e) {
      print('Error reading file: $e');
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Storage Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _writeToFile,
              child: Text('Write to File'),
            ),
            ElevatedButton(
              onPressed: _readFromFile,
              child: Text('Read from File'),
            ),
          ],
        ),
      ),
    );
  }
}

5.3 优缺点

优点:

  • 灵活性高,可以存储各种类型的数据,如文本、图片等。
  • 不需要引入额外的依赖,文件操作相关的库已经包含在Flutter SDK中。
  • 适用于存储大文件或非结构化数据。

缺点:

  • 需要手动管理文件的读写操作,相对麻烦。
  • 不适合存储大量结构化数据,查询和操作相对复杂。
  • 文件存储的性能相对较低,不适合频繁的读写操作。

6. 第三方库

6.1 Hive数据库

Hive是一个轻量级的嵌入式数据库,专为Flutter开发而设计。它提供了快速、简单的数据存储方案,并具有高度的性能和低延迟。

优点:

  • 快速、轻量级,适用于移动设备上的资源受限环境。
  • 采用纯Dart实现,无需平台原生代码,易于集成和使用。
  • 支持类型安全的数据模型,可以轻松地将Dart对象序列化到数据库中。

缺点:

  • 相对较新,可能缺乏一些高级功能和成熟的社区支持。

6.2 ObjectBox

ObjectBox是一种高性能的对象数据库,专为移动设备和嵌入式系统而设计。它提供了快速、简单的数据存储解决方案,具有高度的性能和低延迟。

优点:

  • 高性能,适用于对速度要求较高的应用场景。
  • 支持多种平台,包括Android、iOS、Flutter等。
  • 提供了强大的查询语言和API,方便灵活的数据操作。

缺点:

  • 相对较新,可能缺乏一些成熟的社区支持和文档资源。

6.3 Moor数据库

Moor是一个强大的Flutter数据库库,提供了类型安全、可组合的数据库操作API。它允许使用Dart语言来定义数据库表和查询,而无需编写SQL语句。

优点:

  • 类型安全,可以在编译时捕获到数据库操作中的错误。
  • 支持使用Dart语言来定义数据库表和查询,简化了开发流程。
  • 提供了丰富的功能和灵活的API,适用于各种数据操作需求。

缺点:

  • 学习曲线较陡,需要一定的时间来熟悉其API和工作原理。
  • 相对较新,可能缺乏一些成熟的社区支持和文档资源。

7. 数据加密与安全

7.1 加密存储数据

在Flutter应用中,可以使用加密算法对敏感数据进行加密存储,以增加数据的安全性。常见的加密算法包括AES、RSA等。以下是一个简单的示例,演示了如何使用AES算法对数据进行加密和解密:

import 'package:flutter/material.dart';
import 'package:encrypt/encrypt.dart' as encrypt;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String _plainText = 'Sensitive data';
  final String _secretKey = 'supersecretkey';

  String _encryptedText = '';
  String _decryptedText = '';

  MyHomePage() {
    final encrypter = encrypt.Encrypter(encrypt.AES(encrypt.Key.fromUtf8(_secretKey)));
    final encrypted = encrypter.encrypt(_plainText);
    _encryptedText = encrypted.base64;
    final decrypted = encrypter.decrypt(encrypted);
    _decryptedText = decrypted;
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Data Encryption Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Encrypted Text: $_encryptedText'),
            Text('Decrypted Text: $_decryptedText'),
          ],
        ),
      ),
    );
  }
}

7.2 安全存储敏感信息

对于敏感信息(如用户密码、密钥等),不建议直接存储在本地。可以使用Flutter提供的Secure Storage或第三方库(如flutter_secure_storage)来安全地存储敏感信息。这些库通常会使用系统提供的安全存储机制,如Android的Keystore、iOS的Keychain等,来保护数据免受未经授权的访问。

以下是一个示例,演示了如何使用flutter_secure_storage库来安全存储敏感信息:

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final FlutterSecureStorage _storage = FlutterSecureStorage();

  Future<void> _savePassword() async {
    await _storage.write(key: 'password', value: 'mysecretpassword');
  }

  Future<void> _readPassword() async {
    String password = await _storage.read(key: 'password');
    print('Password: $password');
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Secure Storage Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _savePassword,
              child: Text('Save Password'),
            ),
            ElevatedButton(
              onPressed: _readPassword,
              child: Text('Read Password'),
            ),
          ],
        ),
      ),
    );
  }
}

通过使用加密算法和安全存储机制,可以有效保护Flutter应用中的敏感信息,提高数据的安全性和可靠性。

8. 最佳实践与建议

8.1 选择合适的持久化方式

在选择数据持久化方式时,需要根据应用的需求和特点来决定。对于简单的键值对数据,可以选择使用Shared Preferences;对于结构化数据,可以考虑使用SQLite数据库或第三方库;对于大文件或非结构化数据,可以使用文件存储。综合考虑数据复杂度、性能要求、开发成本等因素,选择最适合的持久化方式。

8.2 管理数据结构与版本

在使用数据库进行数据持久化时,应注意管理数据结构和数据库版本。随着应用的迭代和更新,数据结构可能会发生变化,需要考虑如何处理旧版本数据的兼容性和迁移。可以使用数据库迁移工具或版本管理机制来管理数据结构和版本,确保数据的一致性和完整性。

8.3 处理异常与错误

在进行数据持久化操作时,可能会遇到各种异常和错误,如文件读写错误、数据库连接错误等。为了确保应用的稳定性和可靠性,应适当处理这些异常和错误情况,例如使用try-catch语句捕获异常并进行处理,或者使用错误处理机制进行错误报告和日志记录。同时,建议在进行数据操作前进行适当的检查和验证,以防止出现意外情况。

9. 总结

在Flutter应用中,数据持久化是确保数据在应用关闭或设备重启后仍然保持的重要机制之一。本文介绍了几种常用的数据持久化方式,包括Shared Preferences、SQLite数据库、文件存储以及使用第三方库,每种方式都有其适用的场景和优缺点。

Shared Preferences适用于存储少量简单的键值对数据,如用户偏好设置、配置信息等,使用简单方便。SQLite数据库适用于存储大量结构化数据,支持复杂的查询操作,提供了可靠的数据存储解决方案。文件存储适用于存储大文件或非结构化数据,灵活性高,但不适合存储大量结构化数据。

除了原生的数据持久化方式外,还可以使用第三方库如Hive数据库、ObjectBox、Moor数据库等,这些库提供了更多的功能和性能优化,可以根据具体需求选择最合适的库进行数据持久化操作。

在进行数据持久化时,需要注意选择合适的持久化方式,管理数据结构与版本,以及处理异常与错误。通过合理的数据持久化方案,可以提高应用的稳定性和可靠性,改善用户体验,从而更好地满足用户的需求。

附录:常见问题与解答

问题1:我应该使用哪种数据持久化方式?

答:选择数据持久化方式应该根据你的应用需求来决定。如果只需要存储少量的简单数据,可以使用Shared Preferences;如果需要存储大量的结构化数据并支持复杂的查询操作,可以选择SQLite数据库;如果需要存储大文件或非结构化数据,可以使用文件存储。另外,还可以考虑使用第三方库来满足特定需求。

问题2:如何处理数据结构的变化和数据库版本更新?

答:在进行数据结构变化和数据库版本更新时,可以使用数据库迁移工具或版本管理机制来管理数据结构和版本。这些工具可以帮助你确保数据的一致性和完整性,并提供了方便的方法来处理旧版本数据的兼容性和迁移。

问题3:如何确保数据的安全性?

答:为了确保数据的安全性,可以使用加密算法对敏感数据进行加密存储,同时可以使用安全存储机制(如Secure Storage)来安全地存储敏感信息。另外,还可以考虑实现访问控制和权限管理机制,限制数据的访问权限,确保数据只能被授权的用户访问。

问题4:如何处理数据持久化操作中的异常和错误?

答:在进行数据持久化操作时,可能会遇到各种异常和错误,如文件读写错误、数据库连接错误等。为了确保应用的稳定性和可靠性,可以适当处理这些异常和错误情况,例如使用try-catch语句捕获异常并进行处理,或者使用错误处理机制进行错误报告和日志记录。同时,建议在进行数据操作前进行适当的检查和验证,以防止出现意外情况。

问题5:我应该如何选择合适的第三方库进行数据持久化?

答:选择合适的第三方库应该考虑以下几个因素:

  • 功能需求:不同的库可能提供不同的功能和特性,需要根据你的应用需求来选择最合适的库。
  • 性能要求:一些库可能具有更高的性能和更低的延迟,适合对速度要求较高的应用场景。
  • 社区支持:选择一个活跃的社区支持良好的库,可以获得更好的技术支持和问题解答。
  • 文档资源:选择一个文档资源丰富、易于学习的库,可以加快开发速度和降低学习成本。

综合考虑以上因素,选择最合适的第三方库进行数据持久化操作。

问题6:我应该如何保护用户的隐私数据?

答:保护用户的隐私数据是非常重要的,可以考虑以下几个方面来保护用户的隐私数据:

  • 加密存储:使用加密算法对敏感数据进行加密存储,确保数据在存储和传输过程中不被窃取或篡改。
  • 安全传输:在数据传输过程中使用安全的传输协议(如HTTPS),确保数据在传输过程中不被窃取或窥探。
  • 访问控制:实现访问控制和权限管理机制,限制数据的访问权限,确保数据只能被授权的用户访问。
  • 合规性:遵守相关的隐私法律和法规,保护用户的隐私权益,不滥用用户的个人信息。

通过以上措施,可以有效保护用户的隐私数据,提高数据的安全性和可信度。

问题7:如何优化数据持久化操作的性能?

答:优化数据持久化操作的性能可以从以下几个方面入手:

  • 批量操作:尽量使用批量操作来减少数据库访问次数,提高数据操作的效率。
  • 索引优化:合理使用索引来加速数据查询操作,减少数据的扫描和匹配时间。
  • 异步操作:将耗时的数据操作放在异步任务中执行,避免阻塞UI线程,提高应用的响应速度。
  • 缓存机制:使用缓存机制来缓存常用的数据,减少数据读取和写入的次数,提高数据访问速度。

通过以上优化措施,可以有效提高数据持久化操作的性能,提升应用的用户体验和响应速度。

问题8:我应该如何备份和恢复应用中的数据?

答:备份和恢复应用中的数据是确保数据安全的重要措施之一。你可以考虑以下几种方法来备份和恢复应用中的数据:

  1. 数据库备份:对于使用SQLite等数据库存储数据的应用,可以定期进行数据库备份。你可以编写定期备份数据的任务,并将备份文件保存到安全的位置,以防止数据丢失。
  2. 云存储:将应用中的重要数据上传到云存储服务(如Google Drive、Dropbox等),可以实现数据的自动备份和恢复。你可以使用相关的云存储SDK来实现数据的上传和下载操作。
  3. 导出文件:为用户提供导出数据的功能,允许用户将数据导出为文件进行备份。你可以将数据导出为CSV、JSON等格式的文件,并提供下载或共享功能,方便用户进行数据备份和恢复。
  4. 数据同步:使用数据同步技术,将应用中的数据与服务器端或其他设备进行同步。这样可以确保数据的实时备份和同步,避免数据丢失和不一致。

通过以上方法,可以实现应用中数据的备份和恢复,保障数据的安全和完整性。同时,建议定期测试备份和恢复流程,确保备份数据的可用性和可靠性。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么说“微隔离技术“ 那么重要,德迅零域给您答案

随着网络安全威胁不断增加&#xff0c;传统安全措施难以承受这种压力&#xff0c;人们需要更强大的防护工具来确保个人和组织的数据不会被攻击者窃取。 “微隔离”技术是一种在设备内部进行隔离的安全机制。它基于各种硬件或软件实现不同隔离策略&#xff0c;将不同的数据或应用…

C++——STL容器——string

目录 1.构造函数 模拟实现 2.析构函数 模拟实现 3.string遍历 3.1 c_str、size、lenth、capacity等 模拟实现 3.2 字符串元素访问 3.2.1 []操作符重载、at 模拟实现 3.2.2 front、back等 3.3 迭代器 模拟实现 4.赋值操作 4.1 赋值重载函数 模拟实现 4.2 assig…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码&#xff0c;技术框架&#xff1a;Vue&#xff0c;Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态&#xff0c;确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术&#xff0c;为手术患者…

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

多态.Java

&#xff08;1&#xff09;什么是多态&#xff1f; 同类型的对象&#xff0c;表现出不同的形态。前者指父类&#xff0c;后者指不同的子类 说简单点&#xff0c;就是父类的同一种方法&#xff0c;可以在不同子类中表现出不同的状态&#xff0c;或者说在不同子类中可以实现不同…

[技术闲聊]我对电路设计的理解(七)-Cadence原理图绘制

一、原理图软件推荐 之前的章节有讲过AD、PADS、Cadence&#xff0c;以及三者的应用标准&#xff0c;今天再讲讲这一点。 如果是学生&#xff0c;可以学习AD软件&#xff0c;因为学校在学习&#xff0c;上手容易&#xff0c;而且即使工作后&#xff0c;如果是电机控制等4层板或…

websokcet服务端实现

一/websokcet服务端实现 步骤一&#xff1a; springboot底层帮我们自动配置了websokcet&#xff0c;引入maven依赖 1 2 3 4 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</arti…

力扣刷题 二叉树遍历的统一迭代法

题干 给定一个二叉树的根节点 root &#xff0c;返回 它的 前中后序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root […

Python 之 Fastapi 框架学习

依赖安装 Fastapi 有版本要求&#xff0c;需要的 Python 版本至少是 Python 3.8&#xff08;不要犟&#xff0c;按照版本要求来&#xff0c;我最先也是在我 Python3.6 上装的&#xff0c;果不其然跑不起来&#xff09;&#xff0c;幸好我 Win7 老古董能支持的 Python 最高版本…

FastWiki发布`0.2.4`支持js 函数

Release v0.2.4 AIDotNet/fast-wiki (github.com) 支持JS动态functioncall调用支持动态function管理支持JS在线编辑提供智能代码提示支持JS在线编辑提供部分绑定的c#类&#xff08;默认提供Console&#xff0c;HttpClient&#xff09;支持Application绑定多个Function Call优…

跨站请求伪造漏洞(CSRF)

什么是CSRF CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;即跨站请求伪造攻击。 漏洞原理 跨站请求伪造漏洞的原理主要是利用了网站对用户请求的验证不严谨。攻击者会在恶意网站中构造一个…

linux 文件提权|属性修改

文章目录 suid&#xff08;set uid&#xff09;添加文件属性查看文件属性i &#xff08;immutable&#xff09; umask suid&#xff08;set uid&#xff09; 让文件在执行的时候具有属主&#xff08;对应文件 user &#xff09;的权限 chmod 7744 temp.txt 第一位的7表示权限位…

探寻大数据思想的主要贡献者与核心内容

引言&#xff1a; 在当今数字化时代&#xff0c;大数据已成为企业和科学研究的关键要素。其背后的思想和概念不仅引领了数据处理和分析的革新&#xff0c;也推动了人类对于信息时代的理解与认知。 大数据思想的起源&#xff1a; 在信息爆炸的时代背景下&#xff0c;大数据思…

海外仓的出入库流程有什么痛点?位像素海外仓系统怎么提高出入库效率?

随着跨境电商的蓬勃发展&#xff0c;海外仓是其中不可或缺的一个关键环节。而货物的出库与入库则是海外仓管理中的一个核心业务流程&#xff0c;它的运作效率直接影响到整个跨境物流的效率和客户体验。今天&#xff0c;让我们具体来看一看关于海外仓出入库的流程&#xff0c;其…

150行Python代码模拟太阳系行星运转

今天我们用Python来模拟一下太阳系行星运动轨迹~ 先上成品图&#xff08;运行效果含音乐的呦&#xff09; 想要实现这样的效果并不难 准备材料 首先我们需要准备这样一些材料 宇宙背景图 背景透明的行星图 编写代码 代码分块详解 导入需要的模块 import pygame import …

深度学习理论基础(六)多头注意力机制的自定义及Pytoch库的使用详细代码

目录 1. Scaled Dot-Product Attention2. 多头注意力机制框图&#xff08;1&#xff09;计算公式&#xff08;2&#xff09;具体计算过程&#xff08;3&#xff09;具体代码 深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的…

轻量应用服务器4核8G12M配置优惠价格646元一年零3个月,12M公网带宽

腾讯云轻量4核8G12M服务器优惠价格646元15个月&#xff0c;买一年送3个月&#xff0c;配置为轻量4核8G12M、180GB SSD盘、2000GB月流量、12M带宽&#xff0c;腾讯云优惠活动页面 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器租用价格 腾讯云&…

SaaS模式Java版云HIS系统源码 覆盖医院所有业务的HIS信息管理系统源码

SaaS模式Java版云HIS系统源码 覆盖医院所有业务的HIS信息管理系统源码 HIS&#xff08;Hospital Information System&#xff09;是覆盖医院所有业务和业务全过程的信息管理系统。 HIS系统以财务信息、病人信息和物资信息为主线&#xff0c;通过对信息的收集、存储、传递、统…

Android 窗口那些事儿

目录 1. &#x1f4c2; 前言 你&#xff0c;是否有过这些疑问&#xff1f; 2. &#x1f531; Window 2.1 认识 Window 的几个阶段 1&#xff09;阶段一&#xff1a;Window 约等于 Activity 2&#xff09;阶段二&#xff1a;Window 约等于 View 3&#xff09;阶段三&…

list的使用

前言 我们前面已经对string和vector进行了学习使用&#xff0c;以及对他们的底层进行了模拟实现&#xff01;本期我们继续学习STL的另外一个容器---list。 本期内容介绍 什么是list&#xff1f; list的常用接口 什么是list? 还是来看看官方的文档说明&#xff01; 这里通过…