Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
目录
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
一、简单介绍
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 AUTOINCREMENT或TEXT PRIMARY KEY。字段类型:选择合适的字段类型,如
TEXT、INTEGER、REAL和BLOB,以优化存储和查询性能。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;}
}
代码说明
常量定义:
dbName:定义数据库文件的名称。
dbVersion:定义数据库的版本号,用于版本控制和升级。
tableLocalization:定义存储本地化数据的表名。
columnKey和columnValue:定义表中的字段名,分别用于存储键和值。数据库初始化:
_initDatabase方法通过getDatabasesPath获取设备的数据库存储路径,并使用openDatabase打开或创建数据库文件。如果数据库文件不存在,则会调用
_onCreate方法来创建表结构。表结构创建:
_onCreate方法中,使用 SQL 语句创建localization表,包含两个字段:key(主键,唯一)和value。数据操作方法:
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');
}
代码说明
导入必要的库:
flutter/material.dart:导入 Flutter 的 Material 组件库,用于构建 Flutter 应用。
test_sqflite_0317/database_helper.dart:导入封装的DatabaseHelper类,该类提供了数据库操作的接口。初始化 Flutter 绑定:
WidgetsFlutterBinding.ensureInitialized():在使用 Flutter 的异步操作之前,必须调用此方法来初始化 Flutter 的绑定。这是 Flutter 应用程序启动时的必要步骤。创建
DatabaseHelper实例:
var dbHelper = DatabaseHelper():创建DatabaseHelper的实例,用于后续的数据库操作。保存数据:
await dbHelper.saveLocalization('language', 'en'):调用DatabaseHelper的saveLocalization方法,将键'language'和值'en'保存到数据库中。获取保存的数据:
String? language = await dbHelper.getLocalization('language'):调用DatabaseHelper的getLocalization方法,通过键'language'获取对应的值。
print('Saved language: $language'):打印获取到的语言设置。判断是否有保存的数据:
bool hasLanguage = await dbHelper.hasLocalization('language'):调用DatabaseHelper的hasLocalization方法,检查键'language'是否存在于数据库中。
print('Has language: $hasLanguage'):打印判断结果。移除保存的数据:
await dbHelper.removeLocalization('language'):调用DatabaseHelper的removeLocalization方法,通过键'language'删除对应的记录。再次判断是否有保存的数据:
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;}}
}
代码说明
常量定义:
dbName:定义数据库文件的名称。
dbVersion:定义数据库的版本号,用于版本控制和升级。
tableUsers:定义存储用户信息的表名。
columnId、columnName和columnEmail:定义表中的字段名。数据库实例:
_database:私有变量,用于存储数据库连接实例。获取数据库实例:
database:公共方法,用于获取数据库实例。如果数据库已经初始化,则直接返回;否则调用_initDatabase初始化数据库。初始化数据库:
_initDatabase:获取数据库存储路径,并打开或创建数据库文件。如果数据库不存在,则调用_onCreate方法创建表结构。创建表:
_onCreate:创建users表,包含三个字段:id(自增主键)、name(非空)、数据操作方法:
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();
}
代码说明
导入必要的库:
flutter/material.dart:导入 Flutter 的 Material 组件库,用于构建 Flutter 应用。
database_helper.dart:导入封装的DatabaseHelper类,该类提供了数据库操作的接口。初始化 Flutter 绑定:
WidgetsFlutterBinding.ensureInitialized():在使用 Flutter 的异步操作之前,必须调用此方法来初始化 Flutter 的绑定。这是 Flutter 应用程序启动时的必要步骤。创建
DatabaseHelper实例:
var dbHelper = DatabaseHelper():创建DatabaseHelper的实例,用于后续的数据库操作。插入用户数据:
await dbHelper.insertUser({...}):调用DatabaseHelper的insertUser方法,将用户数据(姓名和邮箱)插入到数据库中。查询所有用户:
List<Map<String, dynamic>> users = await dbHelper.getAllUsers():调用DatabaseHelper的getAllUsers方法,查询数据库中的所有用户数据。
print('All users: $users'):打印所有用户数据。根据ID查询用户:
Map<String, dynamic>? user = await dbHelper.getUserById(1):调用DatabaseHelper的getUserById方法,通过用户ID查询特定用户的数据。
print('User with ID 1: $user'):打印查询到的用户数据。更新用户数据:
await dbHelper.updateUser({...}):调用DatabaseHelper的updateUser方法,更新特定用户的数据。查询更新后的用户:
user = await dbHelper.getUserById(1):再次调用getUserById方法,查询更新后的用户数据。
print('Updated user with ID 1: $user'):打印更新后的用户数据。删除用户:
await dbHelper.deleteUser(1):调用DatabaseHelper的deleteUser方法,删除特定用户。查询所有用户(验证删除操作):
users = await dbHelper.getAllUsers():再次调用getAllUsers方法,查询数据库中的所有用户数据,验证删除操作是否成功。
print('All users after deletion: $users'):打印删除后的所有用户数据。关闭数据库:
await dbHelper.closeDatabase():调用DatabaseHelper的closeDatabase方法,关闭数据库连接,释放资源。通过这些注释,你可以更清晰地理解代码的逻辑和功能,便于在项目中使用和维护。
相关文章:
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装 目录 Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在…...
【leetcode hot 100 208】实现Trie(前缀树)
解法一:字典树 Trie,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段: 指向子节点的指针数组 children。对于本题而言,数组长度为 26,即小写英文字母的数量。此时 children[0] 对应小…...
Pytest的夹具共享(2)
1、问题:夹具跟用例都是写在一个py文件中,在自动化框架中,测试用例、夹具在不同的文件中,跨文件夹具使用呢? “”" 在XXX测试用例模块中,使用夹具? 如何跨文件调用? -1&#x…...
前端安全之DOMPurify基础使用
DOMPurify时一款专门用于防御XSS攻击的库,通过净化HTML的内容,移除恶意脚本,同时保留安全的HTML标签和数学。以下是基础使用指南,涵盖基础的安装与用法。 1,安装DOMPurify 通过npm或yarn安装 npm install dompurify …...
鸿蒙 元服务摘要
元服务(原名原子化服务),是HarmonyOS提供的一种面向未来的服务提供方式,是有独立入口的(用户可通过点击方式直接触发)、免安装的(无需显式安装,由系统程序框架后台安装后即可使用&am…...
【css酷炫效果】纯CSS实现粒子旋转动画
【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492008 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...
k8s中的service解析
k8s中的service解析 在k8s中,我们可以通过pod来创建服务。 然而,当我们创建多个 Pod 来提供同一项服务时,直接通过 Pod IP 进行访问会变得复杂且不可维护。因此,Kubernetes 提供了 Service 这一抽象概念,用于对外暴露…...
案例:图书管理
掌握图书管理案例的实现,能够使用Spring Boot整合Thymeleaf完成图书管理案例。 1.任务需求 (1)项目使用Spring Boot整合Thymeleaf,项目展示的页面效果全部通过Thymeleaf的模板文件实现。 (2)查询所有图书。…...
Docker和Dify学习笔记
文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…...
【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计
欢迎来到Java集合框架系列的第一篇文章!🌹 本系列文章将以通俗易懂的语言,结合实际开发经验,带您深入理解Java集合框架的设计智慧。🌹 若文章中有任何不准确或需要改进的地方,欢迎大家指出,让我…...
VSCode创建VUE项目(四)增加用户Session管理
将用户信息存储或者更新到Session sessionStorage.setItem("userID",loginform.value.username); sessionStorage.setItem(loginTime, Date.now()); 获取Session信息 const storedUserInfo sessionStorage.getItem(userID); const loginTime sessionStorage.get…...
线性代数(1)用 excel 计算鸡兔同笼
线性代数excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析 三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆…...
Qt中多线程
在Qt中实现多线程主要有两种常用方式:基于QThread的子类化和QObjectmoveToThread的Worker模式。以下是详细说明和示例代码: 1. 传统方法:继承 QThread(适用于简单任务) #include <QThread> #include <QDebug…...
Grokking System Design 系统设计面试问题
《Grokking the System Design Interview》列举了多个经典的系统设计题目,通常按照 不同的业务场景和技术难点 进行分类。以下是一些常见的分类和题目示例: 1. 社交网络类 设计 Twitter(支持关注/取关、推文、Feed 流) 设计 Facebook Messenger(即时聊天,支持在线/离线状…...
Android Launcher3 首屏图标锁定技术方案解析
一、需求背景与技术挑战 在Android 13系统定制开发中,需实现Launcher首屏图标固定功能。该需求需在以下技术维度进行突破: 拖拽事件拦截机制:需精准识别拖拽目标区域 布局层级判定:准确识别第一屏的布局标识 跨屏操作限制&…...
hubilder打包ios app, 并上传TestFlight
目录 一 前提条件 不是该项目成员解决 1. 直接找到该项目的管理人员去设置你的账号 2. 直接重新生成APPID(一般不建议的,可以查看) 3. 如果是离职人员,可以让他将项目权限转让出来 - 如何转让应用 - DCloud问答 未申请ios证书和描述文件 APP ID 的…...
AI实干家:HK深度体验-【第7篇-新加坡与香港家办业务对比】
PART I 家族办公室(家办)的定义与统计口径分析 家族办公室(Family Office, FO)的统计口径因地区、政策及数据来源差异而有所不同,需结合官方定义与第三方研究综合判断: 一、家办定义与统计口径 核心定义&…...
Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统
Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…...
【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势
java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…...
剑指 Offer II 107. 矩阵中的距离
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20107.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%9D%E7%A6%BB/README.md 剑指 Offer II 107. 矩阵中的距离 题目描述 给定一个由 0 和 1 组成的矩阵 mat …...
雅可比行列式
定义和推导 雅可比行列式,它是以n个n元函数的偏导数为元素的行列式。以下是雅可比式的推导过程: 二阶雅可比式的推导以二重积分中的极坐标变换为例,设 : ,则 x 和 y 的全微分分别为: 可以将 dx 与 dy 视作…...
UMA架构下的GPU 显存
GPU 显存 (Graphics Memory) 在大多数现代设备(包括 Android 手机、嵌入式设备等)上,确实是使用 DDR(Double Data Rate SDRAM) 类型的内存。 不过,具体实现方式根据硬件架构有所不同,主要分为以…...
【大模型基础_毛玉仁】3.2 上下文学习
目录 3.2 上下文学习3.2.1 上下文学习的定义3.2.2 演示示例选择1)直接检索2)聚类检索3)迭代检索 3.2.3 性能影响因素 3.2 上下文学习 随模型训练数据规模和参数量的扩大,大语言模型涌现出了上下文学习(In-Context Lea…...
在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT
在 ARM 嵌入式 Linux 下使用 C/C 实现 MQTT 通信是一个常见的需求,尤其是在资源受限的环境中。以下是一个详细的教程,使用 Eclipse Paho C Client 库来实现 MQTT 客户端。 1. 安装 Eclipse Paho C Client 库 Eclipse Paho C Client 是一个轻量级的 MQTT…...
Oraclelinux问题-/var/log/pcp/pmlogger/目录超大
有套19c rac环境,操作系统是oracle linux 8.10,日常巡检时发现/var/log/pcp/pmlogger/目录超大,如下 [rootdb1 ~]# du -sh /var/log/pcp/pmlogger/* 468G /var/log/pcp/pmlogger/db 1.3G /var/log/pcp/pmlogger/oracle06-106 754M /…...
【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证
背景: vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现: rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…...
学习笔记 ASP.NET Core Web API 8.0部署到iis
一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…...
Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用
散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…...
第5章:Docker镜像管理实战:构建、推送与版本控制
第5章:Docker镜像管理实战:构建、推送与版本控制 作者:DogDog_Shuai 阅读时间:约25分钟 难度:中级 目录 第5章:Docker镜像管理实战:构建、推送与版本控制 目录1. 引言2. Docker镜像基础 2.1 镜像结构...
Microsoft Edge浏览器的取证分析(基于Chromium)
概述 早在2019年,微软就用Chromium替换了EdgeHTML浏览器引擎,这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium,Edge与Chrome浏览器共享一个共同的架构,这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …...
