linux网站开发工具/广州百度seo

linux网站开发工具,广州百度seo,六安城市网怎么样,做网站的论坛Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装 目录 Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在…

Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装

目录

Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装

一、简单介绍

1. SharedPreferences

2. Path_provider

3. SQLite

二、sqflite

三、安装 sqflite

四、简单案例实现

五、关键代码


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

在Flutter中,进行本地化保存的方法主要有以下几种:

1. SharedPreferences

SharedPreferences 是一种轻量级的存储方案,适用于存储简单的键值对数据,如字符串、整数、布尔值等

。它类似于Android中的SharedPreferences或iOS中的UserDefaults,使用起来非常方便。

  • 优点:简单易用,适合存储少量数据。

  • 缺点:只能存储基本数据类型,不适合存储大量数据

2. Path_provider

path_provider 插件提供了一种平台无关的方式,用于访问设备的文件系统

。它支持访问两种文件位置系统:

  • 临时文件夹:系统可以随时清空的临时(缓存)文件夹。

  • Documents目录:供应用使用,只有在删除应用时,系统才会清除这个目录

通过path_provider,你可以将数据以文件的形式保存到本地,适合存储一些持久化数据或从网络下载的数据

3. SQLite

SQLite 是一种轻量级的关系型数据库,适用于存储结构化的数据

。它提供了强大的数据查询和管理功能,适合存储大量数据。

  • 优点:功能强大,支持复杂的数据结构和查询。

  • 缺点:使用相对复杂,需要编写SQL语句

二、sqflite

sqflite 是一个用于 Flutter 的 SQLite 数据库插件,允许开发者在移动应用中存储和管理本地数据。它提供了简单易用的 API,支持创建数据库、执行 SQL 查询、插入、更新、删除等操作。sqflite 基于 SQLite,适合存储结构化数据,如用户信息、设置等。它支持 Android 和 iOS 平台,通过 Dart 语言操作,方便与 Flutter 应用集成。使用 sqflite 可以实现数据的持久化存储,提升应用的性能和用户体验。

在开发和使用 sqflite 时,需要注意以下几点以确保代码的正确性和性能优化:

1. 初始化数据库

  • 确保初始化:在使用 sqflite 之前,必须先初始化数据库。通常在应用启动时调用 WidgetsFlutterBinding.ensureInitialized(),然后初始化数据库实例。

  • 数据库路径:使用 getDatabasesPath() 获取数据库存储路径,确保路径正确。

2. 数据库版本管理

  • 版本控制:通过 version 参数管理数据库版本。如果需要更新数据库结构,可以在 onUpgrade 回调中编写升级逻辑。

  • 兼容性:确保升级逻辑兼容旧版本数据,避免数据丢失。

3. 表结构设计

  • 主键设计:合理设计表的主键,避免重复和冲突。例如,使用 INTEGER PRIMARY KEY AUTOINCREMENTTEXT PRIMARY KEY

  • 字段类型:选择合适的字段类型,如 TEXTINTEGERREALBLOB,以优化存储和查询性能。

4. 事务管理

  • 使用事务:对于多个操作(如批量插入或更新),使用事务可以提高性能并确保数据一致性。

    await db.transaction((txn) async {await txn.insert('table', data1);await txn.insert('table', data2);
    });

5. 查询优化

  • 索引:为经常查询的字段创建索引,提高查询效率。

    await db.execute('CREATE INDEX idx_column ON table (column)');
  • 避免全表扫描:尽量使用 WHERE 子句进行条件查询,避免全表扫描。

6. 错误处理

  • 捕获异常:在数据库操作中捕获异常,避免应用崩溃。

    try {await db.insert('table', data);
    } catch (e) {print('Error: $e');
    }

7. 资源管理

  • 关闭数据库:在应用退出或不再需要时关闭数据库连接,释放资源。

    await db.close();

8. 异步操作

  • 使用 await:所有数据库操作都是异步的,使用 await 确保操作完成后再继续执行。

  • 避免阻塞主线程:确保数据库操作不会阻塞主线程,影响用户体验。

9. 测试

  • 单元测试:编写单元测试验证数据库操作的正确性。

  • 模拟数据:在测试环境中使用模拟数据,避免依赖真实数据。

10. 安全性

  • SQL 注入:使用参数化查询,避免 SQL 注入攻击。

    await db.query('table', where: 'column = ?', whereArgs: [value]);

11. 备份和恢复

  • 备份数据:定期备份数据库文件,防止数据丢失。

  • 恢复数据:提供恢复机制,允许用户从备份中恢复数据。

12. 日志和调试

  • 启用日志:在开发过程中启用日志,方便调试。

    await db.execute('PRAGMA journal_mode=WAL');

通过遵循这些注意事项,可以确保 sqflite 的使用更加高效、稳定和安全,提升应用的整体质量。

三、安装 sqflite

1、直接运行命令:flutter pub add sqflite

2、或者在 pubspec.yaml 添加

dependencies:sqflite: ^2.4.2

四、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、项目结构如下


 

4、编写一个 DatabaseHelper

5、在 main 中编写一个测试代码

6、运行打印如下

7、继续编写一个复杂些的

8、在 main 中编写一个测试代码

9、运行打印如下

五、关键代码

1、DatabaseHelper 一

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';class DatabaseHelper {// 数据库文件名static const String dbName = "localization.db";// 数据库版本号,用于版本控制和升级static const int dbVersion = 1;// 数据表名,用于存储本地化数据static const String tableLocalization = "localization";// 数据表中的键字段名static const String columnKey = "key";// 数据表中的值字段名static const String columnValue = "value";// 私有数据库实例变量,用于存储数据库连接Database? _database;// 获取数据库实例的公共方法// 如果数据库已经初始化,则直接返回;否则初始化数据库并返回Future<Database> get database async {if (_database != null) return _database!;_database = await _initDatabase();return _database!;}// 初始化数据库的方法Future<Database> _initDatabase() async {// 获取设备的数据库存储路径String path = join(await getDatabasesPath(), dbName);// 打开或创建数据库文件// 如果数据库不存在,则会调用 onCreate 回调方法来创建表return await openDatabase(path, version: dbVersion, onCreate: _onCreate);}// 数据库创建时调用的回调方法// 用于创建数据表结构Future<void> _onCreate(Database db, int version) async {// 执行 SQL 语句,创建 localization 表// 表包含两个字段:key(主键,唯一)和 valueawait db.execute('''CREATE TABLE $tableLocalization ($columnKey TEXT PRIMARY KEY, // 键字段,作为主键$columnValue TEXT // 值字段)''');}// 保存本地化数据的方法Future<void> saveLocalization(String key, String value) async {// 获取数据库实例Database db = await database;// 插入数据到 localization 表// 如果 key 已存在,则使用 ConflictAlgorithm.replace 策略替换原有数据await db.insert(tableLocalization, {columnKey: key, columnValue: value},conflictAlgorithm: ConflictAlgorithm.replace);}// 获取本地化数据的方法Future<String?> getLocalization(String key) async {// 获取数据库实例Database db = await database;// 查询 localization 表,查找指定 key 的数据List<Map<String, dynamic>> result = await db.query(tableLocalization,where: '$columnKey = ?', whereArgs: [key]);// 如果查询结果不为空,返回 value 字段的值;否则返回 nullreturn result.isNotEmpty ? result.first[columnValue] as String? : null;}// 移除本地化数据的方法Future<void> removeLocalization(String key) async {// 获取数据库实例Database db = await database;// 从 localization 表中删除指定 key 的数据await db.delete(tableLocalization, where: '$columnKey = ?', whereArgs: [key]);}// 判断是否存在指定 key 的本地化数据的方法Future<bool> hasLocalization(String key) async {// 获取数据库实例Database db = await database;// 查询 localization 表,查找指定 key 的数据List<Map<String, dynamic>> result = await db.query(tableLocalization,where: '$columnKey = ?', whereArgs: [key]);// 如果查询结果不为空,返回 true;否则返回 falsereturn result.isNotEmpty;}
}

代码说明

  1. 常量定义

    • dbName:定义数据库文件的名称。

    • dbVersion:定义数据库的版本号,用于版本控制和升级。

    • tableLocalization:定义存储本地化数据的表名。

    • columnKeycolumnValue:定义表中的字段名,分别用于存储键和值。

  2. 数据库初始化

    • _initDatabase 方法通过 getDatabasesPath 获取设备的数据库存储路径,并使用 openDatabase 打开或创建数据库文件。

    • 如果数据库文件不存在,则会调用 _onCreate 方法来创建表结构。

  3. 表结构创建

    • _onCreate 方法中,使用 SQL 语句创建 localization 表,包含两个字段:key(主键,唯一)和 value

  4. 数据操作方法

    • saveLocalization:插入或更新数据到 localization 表。

    • getLocalization:查询指定 key 的数据,返回对应的 value

    • removeLocalization:删除指定 key 的数据。

    • hasLocalization:判断是否存在指定 key 的数据。

通过这些注释,你可以更清晰地理解每个方法的作用和实现逻辑,便于在项目中使用和维护。

2、main 一

import 'package:flutter/material.dart'; // 导入 Flutter 的 Material 组件库
import 'package:test_sqflite_0317/database_helper.dart'; // 导入封装的 DatabaseHelper 类void main() async {// 确保 Flutter 绑定初始化// 在使用 Flutter 的异步操作(如数据库操作)之前,需要调用此方法来初始化 Flutter 的绑定。// 这是 Flutter 应用程序启动时的必要步骤,确保可以使用 Flutter 提供的异步功能。WidgetsFlutterBinding.ensureInitialized();// 创建 DatabaseHelper 的实例// DatabaseHelper 是一个封装类,用于管理本地化数据的保存、获取、移除等操作。var dbHelper = DatabaseHelper();// 保存数据到数据库// 调用 DatabaseHelper 的 saveLocalization 方法,将键 'language' 和值 'en' 保存到数据库中。// 这里的 'language' 是一个示例键,'en' 是对应的值,表示语言设置为英语。await dbHelper.saveLocalization('language', 'en');// 从数据库中获取保存的数据// 调用 DatabaseHelper 的 getLocalization 方法,通过键 'language' 获取对应的值。// 如果数据库中存在该键,则返回对应的值;否则返回 null。String? language = await dbHelper.getLocalization('language');// 打印获取到的语言设置// 如果成功获取到值,则打印 'Saved language: en';否则打印 'Saved language: null'。print('Saved language: $language');// 判断数据库中是否有保存的数据// 调用 DatabaseHelper 的 hasLocalization 方法,检查键 'language' 是否存在于数据库中。// 如果存在,返回 true;否则返回 false。bool hasLanguage = await dbHelper.hasLocalization('language');// 打印判断结果// 如果存在该键,则打印 'Has language: true';否则打印 'Has language: false'。print('Has language: $hasLanguage');// 从数据库中移除保存的数据// 调用 DatabaseHelper 的 removeLocalization 方法,通过键 'language' 删除对应的记录。await dbHelper.removeLocalization('language');// 再次判断数据库中是否有保存的数据// 再次调用 hasLocalization 方法,检查键 'language' 是否还存在于数据库中。hasLanguage = await dbHelper.hasLocalization('language');// 打印判断结果// 由于已经删除了该键,因此打印 'Has language after removal: false'。print('Has language after removal: $hasLanguage');
}

代码说明

  1. 导入必要的库

    • flutter/material.dart:导入 Flutter 的 Material 组件库,用于构建 Flutter 应用。

    • test_sqflite_0317/database_helper.dart:导入封装的 DatabaseHelper 类,该类提供了数据库操作的接口。

  2. 初始化 Flutter 绑定

    • WidgetsFlutterBinding.ensureInitialized():在使用 Flutter 的异步操作之前,必须调用此方法来初始化 Flutter 的绑定。这是 Flutter 应用程序启动时的必要步骤。

  3. 创建 DatabaseHelper 实例

    • var dbHelper = DatabaseHelper():创建 DatabaseHelper 的实例,用于后续的数据库操作。

  4. 保存数据

    • await dbHelper.saveLocalization('language', 'en'):调用 DatabaseHelpersaveLocalization 方法,将键 'language' 和值 'en' 保存到数据库中。

  5. 获取保存的数据

    • String? language = await dbHelper.getLocalization('language'):调用 DatabaseHelpergetLocalization 方法,通过键 'language' 获取对应的值。

    • print('Saved language: $language'):打印获取到的语言设置。

  6. 判断是否有保存的数据

    • bool hasLanguage = await dbHelper.hasLocalization('language'):调用 DatabaseHelperhasLocalization 方法,检查键 'language' 是否存在于数据库中。

    • print('Has language: $hasLanguage'):打印判断结果。

  7. 移除保存的数据

    • await dbHelper.removeLocalization('language'):调用 DatabaseHelperremoveLocalization 方法,通过键 'language' 删除对应的记录。

  8. 再次判断是否有保存的数据

    • hasLanguage = await dbHelper.hasLocalization('language'):再次调用 hasLocalization 方法,检查键 'language' 是否还存在于数据库中。

    • print('Has language after removal: $hasLanguage'):打印判断结果。

通过这些注释,你可以更清晰地理解代码的逻辑和功能,便于在项目中使用和维护。

3、DatabaseHelper 二

import 'package:sqflite/sqflite.dart'; // 导入 sqflite 包,用于操作 SQLite 数据库
import 'package:path/path.dart'; // 导入 path 包,用于处理文件路径class DatabaseHelper {// 数据库文件名static const String dbName = "user_management.db";// 数据库版本号,用于版本控制和升级static const int dbVersion = 1;// 数据表名,用于存储用户信息static const String tableUsers = "users";// 数据表中的用户ID字段名,主键static const String columnId = "id";// 数据表中的用户姓名字段名static const String columnName = "name";// 数据表中的用户邮箱字段名,唯一约束static const String columnEmail = "email";// 私有数据库实例变量,用于存储数据库连接Database? _database;// 获取数据库实例的公共方法// 如果数据库已经初始化,则直接返回;否则初始化数据库并返回Future<Database> get database async {if (_database != null) return _database!;_database = await _initDatabase();return _database!;}// 初始化数据库的方法// 获取数据库存储路径,并打开或创建数据库文件Future<Database> _initDatabase() async {// 使用 getDatabasesPath 获取设备的数据库存储路径String path = join(await getDatabasesPath(), dbName);// 打开或创建数据库文件,指定版本号和 onCreate 回调方法return await openDatabase(path, version: dbVersion, onCreate: _onCreate);}// 数据库创建时调用的回调方法// 用于创建数据表结构Future<void> _onCreate(Database db, int version) async {// 执行 SQL 语句,创建 users 表// 表包含三个字段:id(自增主键)、name(非空)、email(非空且唯一)await db.execute('''CREATE TABLE $tableUsers ($columnId INTEGER PRIMARY KEY AUTOINCREMENT, // 用户ID,自增主键$columnName TEXT NOT NULL, // 用户姓名,非空$columnEmail TEXT NOT NULL UNIQUE // 用户邮箱,非空且唯一)''');}// 插入用户数据的方法Future<int> insertUser(Map<String, dynamic> user) async {// 获取数据库实例Database db = await database;// 插入数据到 users 表,返回插入的行IDreturn await db.insert(tableUsers, user);}// 查询所有用户的方法Future<List<Map<String, dynamic>>> getAllUsers() async {// 获取数据库实例Database db = await database;// 查询 users 表,返回所有用户数据return await db.query(tableUsers);}// 根据ID查询用户的方法Future<Map<String, dynamic>?> getUserById(int id) async {// 获取数据库实例Database db = await database;// 查询 users 表,查找指定ID的用户List<Map<String, dynamic>> result = await db.query(tableUsers,where: '$columnId = ?', // 查询条件whereArgs: [id], // 查询参数);// 如果查询结果不为空,返回第一个结果;否则返回 nullreturn result.isNotEmpty ? result.first : null;}// 更新用户数据的方法Future<int> updateUser(Map<String, dynamic> user) async {// 获取数据库实例Database db = await database;// 更新 users 表中的指定用户数据,返回更新的行数return await db.update(tableUsers,user,where: '$columnId = ?', // 更新条件whereArgs: [user[columnId]], // 更新参数);}// 删除用户的方法Future<int> deleteUser(int id) async {// 获取数据库实例Database db = await database;// 删除 users 表中的指定用户,返回删除的行数return await db.delete(tableUsers,where: '$columnId = ?', // 删除条件whereArgs: [id], // 删除参数);}// 关闭数据库的方法Future<void> closeDatabase() async {// 如果数据库实例不为空,则关闭数据库连接if (_database != null) {await _database!.close();_database = null;}}
}

代码说明

  1. 常量定义

    • dbName:定义数据库文件的名称。

    • dbVersion:定义数据库的版本号,用于版本控制和升级。

    • tableUsers:定义存储用户信息的表名。

    • columnIdcolumnNamecolumnEmail:定义表中的字段名。

  2. 数据库实例

    • _database:私有变量,用于存储数据库连接实例。

  3. 获取数据库实例

    • database:公共方法,用于获取数据库实例。如果数据库已经初始化,则直接返回;否则调用 _initDatabase 初始化数据库。

  4. 初始化数据库

    • _initDatabase:获取数据库存储路径,并打开或创建数据库文件。如果数据库不存在,则调用 _onCreate 方法创建表结构。

  5. 创建表

    • _onCreate:创建 users 表,包含三个字段:id(自增主键)、name(非空)、email(非空且唯一)。

  6. 数据操作方法

    • insertUser:插入用户数据到 users 表,返回插入的行ID。

    • getAllUsers:查询 users 表,返回所有用户数据。

    • getUserById:根据用户ID查询用户数据,返回查询结果或 null

    • updateUser:更新指定用户的数据,返回更新的行数。

    • deleteUser:删除指定用户,返回删除的行数。

    • closeDatabase:关闭数据库连接,释放资源。

通过这些注释,你可以更清晰地理解代码的逻辑和功能,便于在项目中使用和维护。

4、main 二

import 'package:flutter/material.dart'; // 导入 Flutter 的 Material 组件库
import 'database_helper.dart'; // 导入封装的 DatabaseHelper 类void main() async {// 确保 Flutter 绑定初始化// 在使用 Flutter 的异步操作(如数据库操作)之前,必须调用此方法来初始化 Flutter 的绑定。// 这是 Flutter 应用程序启动时的必要步骤,确保可以使用 Flutter 提供的异步功能。WidgetsFlutterBinding.ensureInitialized();// 创建 DatabaseHelper 的实例// DatabaseHelper 是一个封装类,用于管理用户数据的保存、查询、更新和删除等操作。var dbHelper = DatabaseHelper();// 插入用户数据// 调用 DatabaseHelper 的 insertUser 方法,将用户数据(姓名和邮箱)插入到数据库中。// 这里插入了一个示例用户,姓名为 'John Doe',邮箱为 'john.doe@example.com'。await dbHelper.insertUser({'name': 'John Doe','email': 'john.doe@example.com'});// 查询所有用户// 调用 DatabaseHelper 的 getAllUsers 方法,查询数据库中的所有用户数据。// 返回的是一个包含所有用户信息的列表,每个用户信息是一个 Map。List<Map<String, dynamic>> users = await dbHelper.getAllUsers();// 打印所有用户数据print('All users: $users');// 根据ID查询用户// 调用 DatabaseHelper 的 getUserById 方法,通过用户ID查询特定用户的数据。// 这里查询ID为1的用户。Map<String, dynamic>? user = await dbHelper.getUserById(1);// 打印查询到的用户数据print('User with ID 1: $user');// 更新用户数据// 调用 DatabaseHelper 的 updateUser 方法,更新特定用户的数据。// 这里将ID为1的用户姓名更新为 'Jane Doe',邮箱更新为 'jane.doe@example.com'。await dbHelper.updateUser({'id': 1,'name': 'Jane Doe','email': 'jane.doe@example.com'});// 查询更新后的用户// 再次调用 getUserById 方法,查询更新后的用户数据。user = await dbHelper.getUserById(1);// 打印更新后的用户数据print('Updated user with ID 1: $user');// 删除用户// 调用 DatabaseHelper 的 deleteUser 方法,删除特定用户。// 这里删除ID为1的用户。await dbHelper.deleteUser(1);// 查询所有用户(验证删除操作)// 再次调用 getAllUsers 方法,查询数据库中的所有用户数据,验证删除操作是否成功。users = await dbHelper.getAllUsers();// 打印删除后的所有用户数据print('All users after deletion: $users');// 关闭数据库// 调用 DatabaseHelper 的 closeDatabase 方法,关闭数据库连接,释放资源。await dbHelper.closeDatabase();
}

代码说明

  1. 导入必要的库

    • flutter/material.dart:导入 Flutter 的 Material 组件库,用于构建 Flutter 应用。

    • database_helper.dart:导入封装的 DatabaseHelper 类,该类提供了数据库操作的接口。

  2. 初始化 Flutter 绑定

    • WidgetsFlutterBinding.ensureInitialized():在使用 Flutter 的异步操作之前,必须调用此方法来初始化 Flutter 的绑定。这是 Flutter 应用程序启动时的必要步骤。

  3. 创建 DatabaseHelper 实例

    • var dbHelper = DatabaseHelper():创建 DatabaseHelper 的实例,用于后续的数据库操作。

  4. 插入用户数据

    • await dbHelper.insertUser({...}):调用 DatabaseHelperinsertUser 方法,将用户数据(姓名和邮箱)插入到数据库中。

  5. 查询所有用户

    • List<Map<String, dynamic>> users = await dbHelper.getAllUsers():调用 DatabaseHelpergetAllUsers 方法,查询数据库中的所有用户数据。

    • print('All users: $users'):打印所有用户数据。

  6. 根据ID查询用户

    • Map<String, dynamic>? user = await dbHelper.getUserById(1):调用 DatabaseHelpergetUserById 方法,通过用户ID查询特定用户的数据。

    • print('User with ID 1: $user'):打印查询到的用户数据。

  7. 更新用户数据

    • await dbHelper.updateUser({...}):调用 DatabaseHelperupdateUser 方法,更新特定用户的数据。

  8. 查询更新后的用户

    • user = await dbHelper.getUserById(1):再次调用 getUserById 方法,查询更新后的用户数据。

    • print('Updated user with ID 1: $user'):打印更新后的用户数据。

  9. 删除用户

    • await dbHelper.deleteUser(1):调用 DatabaseHelperdeleteUser 方法,删除特定用户。

  10. 查询所有用户(验证删除操作)

    • users = await dbHelper.getAllUsers():再次调用 getAllUsers 方法,查询数据库中的所有用户数据,验证删除操作是否成功。

    • print('All users after deletion: $users'):打印删除后的所有用户数据。

  11. 关闭数据库

    • await dbHelper.closeDatabase():调用 DatabaseHelpercloseDatabase 方法,关闭数据库连接,释放资源。

通过这些注释,你可以更清晰地理解代码的逻辑和功能,便于在项目中使用和维护。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群体智能优化算法-粒子群优化算法(Particle Swarm Optimization, PSO,含Matlab源代码)

摘要&#xff08;Abstract&#xff09; 粒子群优化&#xff08;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;受鸟群觅食行为的启发。PSO 通过模拟粒子&#xff08;个体&#xff09;在搜索空间中的运动来寻找最优解。每个粒子根据自身的历史最优位置&#xff08;p…

Redis 在windows下的下载安装与配置

参考链接:https://developer.aliyun.com/article/1395346 下载 Redis 访问 Redis 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis 时&#xff0c;你可以选择 ZIP 包或 MSI 安装&#xff1a; ZIP包&#xff1a;需要手动解压、初始化、配置和…

UE5材质法线强度控制节点FlattenNormal

连法 FlattenNormal内部是这样的 FlattenNormal的作用是用来调整法线强度 连上FlattenNormal后 拉高数值

在 Elasticsearch 中探索基于 NVIDIA 的 GPU 加速向量搜索

作者&#xff1a;来自 Elastic Chris Hegarty 及 Hemant Malik 由 NVIDIA cuVS 提供支持&#xff0c;此次合作旨在为开发者在 Elasticsearch 中的向量搜索提供 GPU 加速。 在 Elastic Engineering 组织内&#xff0c;我们一直致力于优化向量数据库的性能。我们的使命是让 Lucen…

ArcGIS10.X影像智能下载!迁移ArcGIS Pro批量智能高清影像下载工具至ArcGIS!

上周我们分享了 我写的一个ArcGIS Pro版批量下载高清影像&#xff08;谷歌、天地图、ESRI等&#xff09;工具给大家&#xff0c;Deepseek我&#xff01;写一个ArcGIS Pro批量下载高清影像&#xff08;谷歌、天地图、ESRI等&#xff09;工具给大家-CSDN博客文章浏览阅读130次。深…

7 款可视化爬虫工具全解析:案例示范与操作指南

目录 1. ParseHub 2.WebHarvy 3.DataMiner 4.Dexi.io 5.ContentGrabber 6.Portia 7.UiPath 文档聚焦 7 款热门可视化爬虫工具&#xff0c;突出简便的可视化操作&#xff0c;简单拖拽、设置&#xff0c;无需编程知识&#xff0c;人人皆可上手。 1. ParseHub ParseHub 是一…

springboot项目,mapper.xml里面,jdbcType报错 已解决

找了很多资料&#xff0c;最后发现原来是依赖版本不兼容的问题。改了版本号即可 报错原因&#xff1a; springboot版本为2.16.3 但是我导入的依赖版本是3.0.1&#xff0c;不兼容&#xff0c;报错 解决&#xff1a;修改版本号&#xff0c;2.3.1兼容springboot2.6.x。依赖下载完…

rust学习笔记16-206.反转链表(递归)

rust函数递归在14中已经提到&#xff0c;接下来我们把206.反转链表&#xff0c;用递归法实现 递归函数通常包含两个主要部分&#xff1a; 基准条件&#xff08;Base Case&#xff09;&#xff1a;递归终止的条件&#xff0c;避免无限递归。 递归步骤&#xff08;Recursive Ste…

鸿蒙Next开发与未来发展的变革:全场景操作系统的全新纪元

文章目录 引言&#xff1a;从兼容到自主的跨越式进化一、鸿蒙Next技术架构解析1.1 系统架构全景图1.1.1 微内核架构优势 1.2 与OpenHarmony的关系 二、开发范式革命2.1 应用开发模式对比2.1.1 元服务&#xff08;Meta Service&#xff09;定义 2.2 开发工具链升级&#xff08;D…

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…

【OCR】总结github上开源 OCR 工具:让文字识别更简单

前言 在数字化的时代&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据&#xff0c;极大地提高了信息处理的效率。今天&#xff0c;我要给大家介绍一些优秀的开源…

Docker学习笔记(十)搭建Docker私有仓库

一、环境配置 1、宿主机系统&#xff1a;macOS Sequoia(版本15.2) 2、虚拟机VMware Fusion版本&#xff1a;专业版 13.6.2 (24409261) 3、虚拟机系统&#xff1a;AlmaLinux-9-latest-x86_64-boot.iso 二、安装Harbor开源企业级Docker镜像 Harbor 是一个开源的企业级 Docker…

关于微信小程序端base64解码问题

由于atob是浏览器端的&#xff0c;对于微信小程序不支持&#xff0c;导致模拟器【开发工具】显示正常&#xff0c;但真机异常解析失败问题&#xff0c;微信小程序原有的api&#xff0c;官方文档中也废弃了 解决方案&#xff1a; 调用&#xff1a; const decodedString ba…

鸿蒙NEXT项目实战-百得知识库03

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

【css酷炫效果】纯CSS实现进度条加载动画

【css酷炫效果】纯CSS实现进度条加载动画 缘创作背景html结构css样式完整代码基础版进阶版 效果图 通过CSS渐变与背景位移动画&#xff0c;无需JavaScript即可创建流体动态进度条。 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u…

【NeurIPS-2022】CodeFormer: 将人脸复原转化为码本预测以减少LQ-HQ映射的不确定性

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论文动机方法实验 总结互动致谢参考往期回顾 前言 盲人脸恢复是一个高度不适定的…

k8s1.30 部署calio网络

一、介绍 网路组件有很多种&#xff0c;只需要部署其中一个&#xff0c;推荐calio。 calio是一个纯三成的数据中心网络方案&#xff0c;calico支持广泛的平台。如k8s&#xff0c;openstack等。 calio在每一个计算节点利用linux内核&#xff0c;实现了一个高效的虚拟路由器来…

数据结构(python)-------栈和队列2

目录 二、队列 &#xff08;一&#xff09;、定义 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 &#xff08;二&#xff09;、队列与一般线性表的区别 一般线性表 队列 &#xff08;三&#xff09;、分类 …

基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园招聘网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

投资日记_道氏理论技术分析

主要用于我自己参考&#xff0c;我感觉我做事情的时候容易上头&#xff0c;忘掉很多事情。 技术分析有很多方法&#xff0c;但是我个人相信并实践的还是以道氏理论为根本的方法。方法千千万万只有适合自己价值观&#xff0c;习惯&#xff0c;情绪&#xff0c;性格的方法才是好的…