【2026最新】鸿蒙NEXT数据持久化实战:培训班管理系统数据存储全攻略

news2026/5/18 3:12:58
鸿蒙开发中数据总是丢失本地存储和网络请求搞不定本文用15分钟带你彻底搞懂Preferences、RDB、HTTP三大数据持久化方案附完整培训班管理系统实战代码和踩坑记录让你的鸿蒙App数据存储从此安全可靠一、学员信息本地存储1.1 Preferences轻量级存储Preferences适用于存储少量键值对数据如用户配置、登录状态等。// service/PreferencesHelper.ets import preferences from ohos.data.preferences; export class PreferencesHelper { private static instance: PreferencesHelper; private preferencesMap: Mapstring, preferences.Preferences new Map(); private constructor() {} static getInstance(): PreferencesHelper { if (!PreferencesHelper.instance) { PreferencesHelper.instance new PreferencesHelper(); } return PreferencesHelper.instance; } async getPreferences(context: Context, name: string): Promisepreferences.Preferences { if (this.preferencesMap.has(name)) { return this.preferencesMap.get(name)!; } const prefs await preferences.getPreferences(context, name); this.preferencesMap.set(name, prefs); return prefs; } async put(context: Context, name: string, key: string, value: preferences.ValueType): Promisevoid { const prefs await this.getPreferences(context, name); await prefs.put(key, value); await prefs.flush(); } async get(context: Context, name: string, key: string, defaultValue: preferences.ValueType): Promisepreferences.ValueType { const prefs await this.getPreferences(context, name); return await prefs.get(key, defaultValue); } async delete(context: Context, name: string, key: string): Promisevoid { const prefs await this.getPreferences(context, name); await prefs.delete(key); await prefs.flush(); } async clear(context: Context, name: string): Promisevoid { const prefs await this.getPreferences(context, name); await prefs.clear(); await prefs.flush(); } }1.2 用户配置存储// service/UserPreferences.ets import { PreferencesHelper } from ./PreferencesHelper; const PREFS_NAME user_prefs; export class UserPreferences { private static helper: PreferencesHelper PreferencesHelper.getInstance(); // 存储用户ID static async setUserId(context: Context, userId: string): Promisevoid { await this.helper.put(context, PREFS_NAME, user_id, userId); } // 获取用户ID static async getUserId(context: Context): Promisestring { return await this.helper.get(context, PREFS_NAME, user_id, ) as string; } // 存储登录状态 static async setLoginStatus(context: Context, isLoggedIn: boolean): Promisevoid { await this.helper.put(context, PREFS_NAME, is_logged_in, isLoggedIn); } // 获取登录状态 static async getLoginStatus(context: Context): Promiseboolean { return await this.helper.get(context, PREFS_NAME, is_logged_in, false) as boolean; } // 存储用户主题 static async setTheme(context: Context, theme: string): Promisevoid { await this.helper.put(context, PREFS_NAME, theme, theme); } // 获取用户主题 static async getTheme(context: Context): Promisestring { return await this.helper.get(context, PREFS_NAME, theme, light) as string; } // 存储语言设置 static async setLanguage(context: Context, language: string): Promisevoid { await this.helper.put(context, PREFS_NAME, language, language); } // 获取语言设置 static async getLanguage(context: Context): Promisestring { return await this.helper.get(context, PREFS_NAME, language, zh_CN) as string; } // 清除所有用户配置 static async clearAll(context: Context): Promisevoid { await this.helper.clear(context, PREFS_NAME); } }1.3 使用示例// pages/SettingsPage.ets import { UserPreferences } from ../service/UserPreferences; Entry Component struct SettingsPage { State theme: string light; State language: string zh_CN; State isLoggedIn: boolean false; async aboutToAppear() { this.theme await UserPreferences.getTheme(this.context); this.language await UserPreferences.getLanguage(this.context); this.isLoggedIn await UserPreferences.getLoginStatus(this.context); } build() { Column() { // 标题栏 TitleBar({ title: 设置, showBack: true }) List() { // 主题设置 ListItem() { this.SettingItem(主题模式, this.theme light ? 浅色 : 深色, () { this.toggleTheme(); }) } // 语言设置 ListItem() { this.SettingItem(语言, this.language zh_CN ? 简体中文 : English, () { this.toggleLanguage(); }) } // 清除数据 ListItem() { this.SettingItem(清除数据, , () { this.clearData(); }) } } .layoutWeight(1) } .width(100%) .height(100%) .backgroundColor(#F5F5F5) } Builder SettingItem(label: string, value: string, clickCallback: () void) { Row() { Text(label) .fontSize(16) .fontColor(#333333) Text(value) .fontSize(14) .fontColor(#999999) .layoutWeight(1) .textAlign(TextAlign.End) Image($r(app.media.ic_arrow_right)) .width(16) .height(16) .fillColor(#CCCCCC) } .width(100%) .height(56) .padding({ left: 16, right: 16 }) .backgroundColor(#FFFFFF) .onClick(clickCallback) } async toggleTheme() { this.theme this.theme light ? dark : light; await UserPreferences.setTheme(this.context, this.theme); } async toggleLanguage() { this.language this.language zh_CN ? en_US : zh_CN; await UserPreferences.setLanguage(this.context, this.language); } async clearData() { // 显示确认弹窗 AlertDialog.show({ title: 确认清除, message: 确定要清除所有本地数据吗, primaryButton: { value: 取消, action: () {} }, secondaryButton: { value: 确定, action: async () { await UserPreferences.clearAll(this.context); Utils.showToast(数据已清除); } } }); } }二、课程数据管理2.1 关系型数据库RDB使用RDB适用于存储结构化数据如学员信息、课程信息、报名记录等。// service/RdbHelper.ets import rdb from ohos.data.relationalStore; const DB_NAME training_management.db; const DB_VERSION 1; export class RdbHelper { private static instance: RdbHelper; private rdbStore: rdb.RdbStore | null null; private constructor() {} static getInstance(): RdbHelper { if (!RdbHelper.instance) { RdbHelper.instance new RdbHelper(); } return RdbHelper.instance; } async init(context: Context): Promisevoid { const config: rdb.StoreConfig { name: DB_NAME, securityLevel: rdb.SecurityLevel.S1 }; this.rdbStore await rdb.getRdbStore(context, config, DB_VERSION); await this.createTables(); } private async createTables(): Promisevoid { // 学员表 const createStudentTable CREATE TABLE IF NOT EXISTS student ( id TEXT PRIMARY KEY, name TEXT NOT NULL, phone TEXT, email TEXT, gender INTEGER DEFAULT 0, birthday TEXT, address TEXT, avatar TEXT, status INTEGER DEFAULT 0, create_time TEXT, update_time TEXT ) ; // 课程表 const createCourseTable CREATE TABLE IF NOT EXISTS course ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, teacher TEXT, price REAL, duration INTEGER, max_students INTEGER, current_students INTEGER DEFAULT 0, start_time TEXT, end_time TEXT, status INTEGER DEFAULT 0, create_time TEXT, update_time TEXT ) ; // 报名表 const createEnrollmentTable CREATE TABLE IF NOT EXISTS enrollment ( id TEXT PRIMARY KEY, student_id TEXT NOT NULL, course_id TEXT NOT NULL, enroll_time TEXT, status INTEGER DEFAULT 0, remark TEXT, create_time TEXT, update_time TEXT, FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) ) ; await this.rdbStore?.executeSql(createStudentTable); await this.rdbStore?.executeSql(createCourseTable); await this.rdbStore?.executeSql(createEnrollmentTable); } getRdbStore(): rdb.RdbStore | null { return this.rdbStore; } }2.2 课程服务实现// service/CourseService.ets import { RdbHelper } from ./RdbHelper; import { Course } from ../model/Course; import rdb from ohos.data.relationalStore; export class CourseService { private rdbHelper: RdbHelper RdbHelper.getInstance(); // 插入课程 async insertCourse(course: Course): Promisevoid { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return; const valueBucket: rdb.ValueBucket { id: course.id, name: course.name, description: course.description, teacher: course.teacher, price: course.price, duration: course.duration, max_students: course.maxStudents, current_students: course.currentStudents, start_time: course.startTime, end_time: course.endTime, status: course.status, create_time: course.createTime, update_time: course.updateTime }; await rdbStore.insert(course, valueBucket); } // 查询所有课程 async getAllCourses(): PromiseCourse[] { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return []; const predicates new rdb.RdbPredicates(course); const resultSet await rdbStore.query(predicates, [ id, name, description, teacher, price, duration, max_students, current_students, start_time, end_time, status, create_time, update_time ]); const courses: Course[] []; while (resultSet.goToNextRow()) { const course: Course { id: resultSet.getString(resultSet.getColumnIndex(id)), name: resultSet.getString(resultSet.getColumnIndex(name)), description: resultSet.getString(resultSet.getColumnIndex(description)), teacher: resultSet.getString(resultSet.getColumnIndex(teacher)), price: resultSet.getDouble(resultSet.getColumnIndex(price)), duration: resultSet.getInt(resultSet.getColumnIndex(duration)), maxStudents: resultSet.getInt(resultSet.getColumnIndex(max_students)), currentStudents: resultSet.getInt(resultSet.getColumnIndex(current_students)), startTime: resultSet.getString(resultSet.getColumnIndex(start_time)), endTime: resultSet.getString(resultSet.getColumnIndex(end_time)), status: resultSet.getInt(resultSet.getColumnIndex(status)), createTime: resultSet.getString(resultSet.getColumnIndex(create_time)), updateTime: resultSet.getString(resultSet.getColumnIndex(update_time)) }; courses.push(course); } resultSet.close(); return courses; } // 根据ID查询课程 async getCourseById(courseId: string): PromiseCourse | null { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return null; const predicates new rdb.RdbPredicates(course); predicates.equalTo(id, courseId); const resultSet await rdbStore.query(predicates, [ id, name, description, teacher, price, duration, max_students, current_students, start_time, end_time, status, create_time, update_time ]); if (resultSet.rowCount 0) { resultSet.close(); return null; } resultSet.goToNextRow(); const course: Course { id: resultSet.getString(resultSet.getColumnIndex(id)), name: resultSet.getString(resultSet.getColumnIndex(name)), description: resultSet.getString(resultSet.getColumnIndex(description)), teacher: resultSet.getString(resultSet.getColumnIndex(teacher)), price: resultSet.getDouble(resultSet.getColumnIndex(price)), duration: resultSet.getInt(resultSet.getColumnIndex(duration)), maxStudents: resultSet.getInt(resultSet.getColumnIndex(max_students)), currentStudents: resultSet.getInt(resultSet.getColumnIndex(current_students)), startTime: resultSet.getString(resultSet.getColumnIndex(start_time)), endTime: resultSet.getString(resultSet.getColumnIndex(end_time)), status: resultSet.getInt(resultSet.getColumnIndex(status)), createTime: resultSet.getString(resultSet.getColumnIndex(create_time)), updateTime: resultSet.getString(resultSet.getColumnIndex(update_time)) }; resultSet.close(); return course; } // 更新课程 async updateCourse(course: Course): Promisevoid { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return; const valueBucket: rdb.ValueBucket { name: course.name, description: course.description, teacher: course.teacher, price: course.price, duration: course.duration, max_students: course.maxStudents, current_students: course.currentStudents, start_time: course.startTime, end_time: course.endTime, status: course.status, update_time: Utils.formatDate(new Date()) }; const predicates new rdb.RdbPredicates(course); predicates.equalTo(id, course.id); await rdbStore.update(valueBucket, predicates); } // 删除课程 async deleteCourse(courseId: string): Promisevoid { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return; const predicates new rdb.RdbPredicates(course); predicates.equalTo(id, courseId); await rdbStore.delete(predicates); } // 搜索课程 async searchCourses(keyword: string): PromiseCourse[] { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return []; const predicates new rdb.RdbPredicates(course); predicates.like(name, %${keyword}%); const resultSet await rdbStore.query(predicates, [ id, name, description, teacher, price, duration, max_students, current_students, start_time, end_time, status, create_time, update_time ]); const courses: Course[] []; while (resultSet.goToNextRow()) { const course: Course { id: resultSet.getString(resultSet.getColumnIndex(id)), name: resultSet.getString(resultSet.getColumnIndex(name)), description: resultSet.getString(resultSet.getColumnIndex(description)), teacher: resultSet.getString(resultSet.getColumnIndex(teacher)), price: resultSet.getDouble(resultSet.getColumnIndex(price)), duration: resultSet.getInt(resultSet.getColumnIndex(duration)), maxStudents: resultSet.getInt(resultSet.getColumnIndex(max_students)), currentStudents: resultSet.getInt(resultSet.getColumnIndex(current_students)), startTime: resultSet.getString(resultSet.getColumnIndex(start_time)), endTime: resultSet.getString(resultSet.getColumnIndex(end_time)), status: resultSet.getInt(resultSet.getColumnIndex(status)), createTime: resultSet.getString(resultSet.getColumnIndex(create_time)), updateTime: resultSet.getString(resultSet.getColumnIndex(update_time)) }; courses.push(course); } resultSet.close(); return courses; } // 获取课程统计 async getCourseStats(): Promise{ total: number; inProgress: number; ended: number } { const rdbStore this.rdbHelper.getRdbStore(); if (!rdbStore) return { total: 0, inProgress: 0, ended: 0 }; const totalResult await rdbStore.querySql(SELECT COUNT(*) as count FROM course); totalResult.goToNextRow(); const total totalResult.getInt(0); totalResult.close(); const inProgressResult await rdbStore.querySql(SELECT COUNT(*) as count FROM course WHERE status 1); inProgressResult.goToNextRow(); const inProgress inProgressResult.getInt(0); inProgressResult.close(); const endedResult await rdbStore.querySql(SELECT COUNT(*) as count FROM course WHERE status 2); endedResult.goToNextRow(); const ended endedResult.getInt(0); endedResult.close(); return { total, inProgress, ended }; } }三、网络请求与API对接3.1 HTTP请求封装// service/HttpHelper.ets import http from ohos.net.http; export class HttpHelper { private static baseUrl: string https://api.example.com; static async getT(path: string, params?: Recordstring, string): PromiseT { const url this.buildUrl(path, params); const httpRequest http.createHttp(); try { const response await httpRequest.request(url, { method: http.RequestMethod.GET, header: { Content-Type: application/json, Authorization: Bearer ${await this.getToken()} } }); if (response.responseCode 200) { return JSON.parse(response.result as string) as T; } else { throw new Error(HTTP Error: ${response.responseCode}); } } finally { httpRequest.destroy(); } } static async postT(path: string, data: Recordstring, any): PromiseT { const url this.buildUrl(path); const httpRequest http.createHttp(); try { const response await httpRequest.request(url, { method: http.RequestMethod.POST, header: { Content-Type: application/json, Authorization: Bearer ${await this.getToken()} }, extraData: JSON.stringify(data) }); if (response.responseCode 200) { return JSON.parse(response.result as string) as T; } else { throw new Error(HTTP Error: ${response.responseCode}); } } finally { httpRequest.destroy(); } } static async putT(path: string, data: Recordstring, any): PromiseT { const url this.buildUrl(path); const httpRequest http.createHttp(); try { const response await httpRequest.request(url, { method: http.RequestMethod.PUT, header: { Content-Type: application/json, Authorization: Bearer ${await this.getToken()} }, extraData: JSON.stringify(data) }); if (response.responseCode 200) { return JSON.parse(response.result as string) as T; } else { throw new Error(HTTP Error: ${response.responseCode}); } } finally { httpRequest.destroy(); } } static async deleteT(path: string): PromiseT { const url this.buildUrl(path); const httpRequest http.createHttp(); try { const response await httpRequest.request(url, { method: http.RequestMethod.DELETE, header: { Content-Type: application/json, Authorization: Bearer ${await this.getToken()} } }); if (response.responseCode 200) { return JSON.parse(response.result as string) as T; } else { throw new Error(HTTP Error: ${response.responseCode}); } } finally { httpRequest.destroy(); } } private static buildUrl(path: string, params?: Recordstring, string): string { let url ${this.baseUrl}${path}; if (params) { const queryString Object.entries(params) .map(([key, value]) ${encodeURIComponent(key)}${encodeURIComponent(value)}) .join(); url ?${queryString}; } return url; } private static async getToken(): Promisestring { // 从本地存储获取token return await UserPreferences.getToken(); } }3.2 API服务封装// service/ApiService.ets import { HttpHelper } from ./HttpHelper; export interface ApiResponseT { code: number; message: string; data: T; } export class ApiService { // 获取课程列表 static async getCourses(): PromiseCourse[] { const response await HttpHelper.getApiResponseCourse[](/courses); return response.data; } // 获取课程详情 static async getCourseDetail(courseId: string): PromiseCourse { const response await HttpHelper.getApiResponseCourse(/courses/${courseId}); return response.data; } // 创建课程 static async createCourse(course: Course): PromiseCourse { const response await HttpHelper.postApiResponseCourse(/courses, course); return response.data; } // 更新课程 static async updateCourse(courseId: string, course: Course): PromiseCourse { const response await HttpHelper.putApiResponseCourse(/courses/${courseId}, course); return response.data; } // 删除课程 static async deleteCourse(courseId: string): Promisevoid { await HttpHelper.deleteApiResponsevoid(/courses/${courseId}); } // 获取学员列表 static async getStudents(): PromiseStudent[] { const response await HttpHelper.getApiResponseStudent[](/students); return response.data; } // 创建报名 static async createEnrollment(enrollment: Enrollment): PromiseEnrollment { const response await HttpHelper.postApiResponseEnrollment(/enrollments, enrollment); return response.data; } }四、数据缓存策略4.1 缓存管理器// service/CacheManager.ets export class CacheManager { private static cache: Mapstring, { data: any; timestamp: number } new Map(); private static CACHE_DURATION 5 * 60 * 1000; // 5分钟缓存 static set(key: string, data: any): void { this.cache.set(key, { data: data, timestamp: Date.now() }); } static getT(key: string): T | null { const cached this.cache.get(key); if (!cached) return null; const isExpired Date.now() - cached.timestamp this.CACHE_DURATION; if (isExpired) { this.cache.delete(key); return null; } return cached.data as T; } static has(key: string): boolean { const cached this.cache.get(key); if (!cached) return false; const isExpired Date.now() - cached.timestamp this.CACHE_DURATION; if (isExpired) { this.cache.delete(key); return false; } return true; } static delete(key: string): void { this.cache.delete(key); } static clear(): void { this.cache.clear(); } }4.2 带缓存的数据服务// service/CachedCourseService.ets import { CacheManager } from ./CacheManager; export class CachedCourseService { private static CACHE_KEY_ALL_COURSES all_courses; private static courseService: CourseService new CourseService(); static async getAllCourses(): PromiseCourse[] { // 先从缓存获取 const cached CacheManager.getCourse[](this.CACHE_KEY_ALL_COURSES); if (cached) { return cached; } // 缓存未命中从数据库获取 const courses await this.courseService.getAllCourses(); // 存入缓存 CacheManager.set(this.CACHE_KEY_ALL_COURSES, courses); return courses; } static async getCourseById(courseId: string): PromiseCourse | null { const cacheKey course_${courseId}; // 先从缓存获取 const cached CacheManager.getCourse(cacheKey); if (cached) { return cached; } // 缓存未命中从数据库获取 const course await this.courseService.getCourseById(courseId); if (course) { CacheManager.set(cacheKey, course); } return course; } static async insertCourse(course: Course): Promisevoid { await this.courseService.insertCourse(course); // 清除相关缓存 CacheManager.delete(this.CACHE_KEY_ALL_COURSES); } static async updateCourse(course: Course): Promisevoid { await this.courseService.updateCourse(course); // 清除相关缓存 CacheManager.delete(this.CACHE_KEY_ALL_COURSES); CacheManager.delete(course_${course.id}); } static async deleteCourse(courseId: string): Promisevoid { await this.courseService.deleteCourse(courseId); // 清除相关缓存 CacheManager.delete(this.CACHE_KEY_ALL_COURSES); CacheManager.delete(course_${courseId}); } }五、离线功能实现5.1 离线数据同步// service/OfflineSyncService.ets export class OfflineSyncService { private static pendingOperations: Array{ type: create | update | delete; table: string; data: any; timestamp: number; } []; // 添加待同步操作 static addPendingOperation( type: create | update | delete, table: string, data: any ): void { this.pendingOperations.push({ type, table, data, timestamp: Date.now() }); // 保存到本地存储 this.savePendingOperations(); } // 同步待处理操作 static async syncPendingOperations(): Promisevoid { const operations [...this.pendingOperations]; for (const operation of operations) { try { await this.executeOperation(operation); // 成功后移除 this.pendingOperations this.pendingOperations.filter( op op.timestamp ! operation.timestamp ); } catch (error) { console.error(同步操作失败:, error); break; } } // 保存更新后的待处理操作 this.savePendingOperations(); } private static async executeOperation(operation: any): Promisevoid { switch (operation.type) { case create: await this.executeCreate(operation.table, operation.data); break; case update: await this.executeUpdate(operation.table, operation.data); break; case delete: await this.executeDelete(operation.table, operation.data); break; } } private static async executeCreate(table: string, data: any): Promisevoid { switch (table) { case courses: await ApiService.createCourse(data); break; case students: await ApiService.createStudent(data); break; case enrollments: await ApiService.createEnrollment(data); break; } } private static async executeUpdate(table: string, data: any): Promisevoid { switch (table) { case courses: await ApiService.updateCourse(data.id, data); break; case students: await ApiService.updateStudent(data.id, data); break; } } private static async executeDelete(table: string, data: any): Promisevoid { switch (table) { case courses: await ApiService.deleteCourse(data.id); break; case students: await ApiService.deleteStudent(data.id); break; } } private static savePendingOperations(): void { // 保存到Preferences const operationsJson JSON.stringify(this.pendingOperations); // 实际实现中需要调用Preferences保存 } static loadPendingOperations(): void { // 从Preferences加载 // 实际实现中需要调用Preferences读取 this.pendingOperations []; } static getPendingOperationsCount(): number { return this.pendingOperations.length; } }5.2 网络状态监听// service/NetworkMonitor.ets import { connection } from kit.NetworkKit; export class NetworkMonitor { private static isOnline: boolean true; private static listeners: Array(isOnline: boolean) void []; static async init(): Promisevoid { // 获取初始网络状态 try { const netConn connection.createNetConnection(); const netCapabilities await netConn.getNetCapabilities(); this.isOnline netCapabilities.linkUp netCapabilities.linkAddresses.length 0; } catch (error) { console.error(获取网络状态失败:, error); } // 监听网络变化 connection.on(netAvailable, () { this.isOnline true; this.notifyListeners(); }); connection.on(netUnavailable, () { this.isOnline false; this.notifyListeners(); }); } static getIsOnline(): boolean { return this.isOnline; } static addListener(listener: (isOnline: boolean) void): void { this.listeners.push(listener); } static removeListener(listener: (isOnline: boolean) void): void { this.listeners this.listeners.filter(l l ! listener); } private static notifyListeners(): void { this.listeners.forEach(listener { listener(this.isOnline); }); } }六、踩坑记录6.1 Preferences数据丢失问题应用更新后Preferences数据丢失。原因应用签名变更导致Preferences文件被清除。解决方案// 使用RDB存储重要数据Preferences仅存储临时配置 // 或者在应用更新时迁移数据6.2 RDB并发访问问题问题多线程同时访问RDB导致异常。原因RDB不支持并发写入。解决方案// 使用队列串行化数据库操作 private operationQueue: Array() Promisevoid []; private isProcessing: boolean false; async enqueueOperation(operation: () Promisevoid): Promisevoid { this.operationQueue.push(operation); if (!this.isProcessing) { await this.processQueue(); } } private async processQueue(): Promisevoid { this.isProcessing true; while (this.operationQueue.length 0) { const operation this.operationQueue.shift(); if (operation) { await operation(); } } this.isProcessing false; }6.3 HTTP请求超时问题网络不稳定时请求超时。原因未设置合理的超时时间。解决方案// 设置请求超时 const response await httpRequest.request(url, { method: http.RequestMethod.GET, connectTimeout: 10000, // 10秒连接超时 readTimeout: 30000, // 30秒读取超时 header: { Content-Type: application/json } });七、总结与预告本文要点回顾Preferences轻量级键值对存储适用于配置数据RDB关系型数据库适用于结构化数据HTTP请求网络API封装支持RESTful接口数据缓存内存缓存策略提升访问性能离线功能离线数据同步保证数据一致性下期预告下期我们将深入讲解性能优化篇包括学员列表性能优化图片加载与缓存优化启动速度优化内存管理与泄漏检测互动引导如果本文对你有帮助请点赞、收藏、关注有任何问题欢迎在评论区留言我会及时回复。系列文章导航第1篇项目架构篇第2篇UI界面篇第3篇状态管理篇第4篇数据持久化篇本文第5篇性能优化篇

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…