UniApp小程序端数据持久化
在UniApp开发小程序时,数据持久化是确保应用功能完整性和用户体验的关键技术。
本指南将详细介绍UniApp小程序端数据持久化的多种方案、平台差异、容量限制以及最佳实践。
一、基础持久化方案
1. 本地存储API
UniApp提供了跨平台的本地存储API,这是最常用的持久化方法:
同步API:
// 存储数据 uni.setStorageSync('keyName', 'valueData'); // 获取数据 const value = uni.getStorageSync('keyName'); // 移除单个数据 uni.removeStorageSync('keyName'); // 清空所有缓存 uni.clearStorageSync();
异步API:
// 异步存储 uni.setStorage({ key: 'userInfo', data: {name: 'Alice', age: 25}, success: () => console.log('存储成功'), fail: (err) => console.error('存储失败:', err) }); // 异步获取 uni.getStorage({ key: 'userInfo', success: (res) => console.log('获取的数据:', res.data) });
注意:推荐使用UniApp提供的跨平台API而非浏览器的localStorage,后者仅H5端支持
2. Pinia状态管理持久化
对于复杂应用状态,可以使用Pinia配合持久化插件:
安装Pinia和适配小程序的持久化插件
创建Store时配置持久化:
import { defineStore } from 'pinia'; export const useUserStore = defineStore('user', { state: () => ({ userInfo: null }), persist: { key: 'user-store', storage: { getItem: (key) => uni.getStorageSync(key), setItem: (key, value) => uni.setStorageSync(key, value), removeItem: (key) => uni.removeStorageSync(key) } } });
在应用初始化时从存储加载状态
二、高级持久化方案
1. SQLite数据库集成
对于需要结构化存储或大量数据的场景:
配置manifest.json启用SQLite支持
创建数据库操作模块:
// sqlite.js module.exports = { dbName: 'myDatabase', dbPath: '_doc/sqlite/myDatabase.db', openSqlite() { return new Promise((resolve, reject) => { plus.sqlite.openDatabase({ name: this.dbName, path: this.dbPath, success: resolve, fail: reject }); }); }, executeSQL(sql, params = []) { return new Promise((resolve, reject) => { plus.sqlite.executeSql({ name: this.dbName, sql, success: resolve, fail: reject }, params); }); } };
在页面中使用:
import sqlite from '@/utils/sqlite'; await sqlite.openSqlite(); await sqlite.executeSQL('CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT)');
注意:SQLite操作需要在真机或模拟器测试,不支持浏览器环境
2. 文件系统存储
对于大文件或复杂数据结构:
// 保存文件 uni.saveFile({ tempFilePath: 'temp/file/path', success: (res) => { console.log('文件保存成功', res.savedFilePath); } }); // 读取文件 uni.getFileSystemManager().readFile({ filePath: 'saved/file/path', encoding: 'utf8', success: (res) => console.log(res.data) });
三、平台差异与限制
1. 存储容量限制
2. 平台API差异
微信小程序:
支持完整的HTTP方法(PUT/DELETE)
文件名允许使用@符号
返回按钮在沉浸式导航中会消失
支付宝小程序:
仅支持GET/POST请求
文件名不允许@符号
span标签事件绑定不生效
动态class绑定不支持数组/对象形式
解决方案:使用条件编译处理平台差异:
// #ifdef MP-WEIXIN // 微信小程序特有代码 // #endif // #ifdef MP-ALIPAY // 支付宝小程序特有代码 // #endif
四、数据同步与安全策略
1. 离线优先同步方案
// 离线存储数据结构 const offlineData = { timestamp: Date.now(), data: { /* 业务数据 */ }, synced: false }; // 网络可用时同步 function trySync() { const offlineQueue = uni.getStorageSync('offlineQueue') || []; offlineQueue.forEach(item => { if(!item.synced) { uni.request({ url: 'https://api.example.com/sync', method: 'POST', data: item.data, success: () => { item.synced = true; uni.setStorageSync('offlineQueue', offlineQueue); } }); } }); } // 监听网络状态变化 uni.onNetworkStatusChange((res) => { if(res.isConnected) trySync(); });
2. 数据加密策略
基础加密:
// 简单加密示例(生产环境应使用更安全的算法) function encrypt(data, key) { return CryptoJS.AES.encrypt(JSON.stringify(data), key).toString(); } function decrypt(ciphertext, key) { const bytes = CryptoJS.AES.decrypt(ciphertext, key); return JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); } // 存储加密数据 uni.setStorageSync('userToken', encrypt(token, 'secret-key'));
使用uni-storage插件:
支持多种存储后端(内存、本地存储、内存缓存)
可配置加密存储方式
提供统一的数据管理接口
五、性能优化建议
合理使用存储:
只持久化必要数据
对大对象进行分块存储
定期清理过期数据
异步操作:
主线程避免同步存储操作
使用Promise封装异步API
数据格式优化:
复杂数据序列化为JSON存储
二进制数据使用ArrayBuffer
错误处理:
try { const largeData = uni.getStorageSync('largeData'); if(!largeData) throw new Error('数据不存在'); } catch(err) { console.error('存储操作失败:', err); // 降级处理或提示用户 }
通过合理选择持久化方案、处理平台差异并实施数据同步策略,
可以确保UniApp小程序在各种网络条件下提供一致的用户体验。
建议根据具体业务需求选择最适合的方案组合,并在开发过程中充分测试各平台的兼容性