HarmonyOS开发实战:小分享-AppPreferences 实现收藏数据持久化
前言
数据持久化是移动应用的基础能力,让用户数据在应用重启后不丢失。HarmonyOS 提供了@ohos.data.preferences实现轻量级键值存储。本篇讲解如何将收藏数据持久化。详细 API 可参考 HarmonyOS Preferences 官方文档。
一、Preferences 基本用法
1.1 获取 Preferences 实例
import { preferences } from '@ohos.data.preferences'; import { BusinessError } from '@ohos.base'; let dataPreferences: preferences.Preferences | null = null; async function getPreferences(context: Context): Promise<void> { try { dataPreferences = await preferences.getPreferences(context, 'favorites_store'); } catch (err) { let code = (err as BusinessError).code; console.error('Failed to get preferences, code: ' + code); } }1.2 写入数据
async function saveFavorites(items: Array<FavoriteItem>): Promise<void> { if (!dataPreferences) return; try { await dataPreferences.put('favorites', JSON.stringify(items)); await dataPreferences.flush(); } catch (err) { console.error('Failed to save favorites, code: ' + (err as BusinessError).code); } }1.3 读取数据
async function loadFavorites(): Promise<Array<FavoriteItem>> { if (!dataPreferences) return []; try { const jsonStr = await dataPreferences.get('favorites', '[]'); return JSON.parse(jsonStr) as Array<FavoriteItem>; } catch (err) { console.error('Failed to load favorites, code: ' + (err as BusinessError).code); return []; } }二、在 FavoritesPage 中集成
2.1 集成代码
@Entry @Component struct FavoritesPage { @State favorites: Array<FavoriteItem> = []; async aboutToAppear(): Promise<void> { await getPreferences(this.context); this.favorites = await loadFavorites(); } async onFavoriteChanged(): Promise<void> { await saveFavorites(this.favorites); } }三、Preferences API 总结
| API | 作用 | 说明 |
|---|---|---|
getPreferences(context, name) | 获取实例 | 异步 |
put(key, value) | 写入 | 支持 string/number/boolean |
get(key, defaultValue) | 读取 | 指定默认值 |
delete(key) | 删除 | 删除指定键 |
flush() | 持久化 | 写入磁盘 |
clear() | 清空 | 删除所有键 |
四、本文核心知识点
4.1 数据持久化核心要点
- Preferences 轻量级键值存储
- put 写入,get 读取,flush 持久化
- JSON.stringify/parse 序列化复杂对象
4.2 实战开发要点
- 所有操作用 try/catch 包裹
- 写入后调用 flush() 确保落盘
- 复杂对象序列化存储
附录:Preferences 数据持久化的完整实现细节
1. Preferences 完整 API
| API | 作用 | 异步 |
|---|---|---|
getPreferences(context, name) | 获取实例 | 是 |
put(key, value) | 写入数据 | 是 |
get(key, defaultValue) | 读取数据 | 是 |
delete(key) | 删除键 | 是 |
flush() | 持久化到磁盘 | 是 |
clear() | 清空所有数据 | 是 |
on('change', cb) | 监听变化 | 否 |
2. 完整的使用示例
import { preferences } from '@ohos.data.preferences'; import { BusinessError } from '@ohos.base'; async function saveData(context: Context, key: string, value: string): Promise<void> { try { let prefs = await preferences.getPreferences(context, 'my_store'); await prefs.put(key, value); await prefs.flush(); } catch (err) { console.error('Save failed: ' + JSON.stringify(err)); } } async function loadData(context: Context, key: string): Promise<string> { try { let prefs = await preferences.getPreferences(context, 'my_store'); return await prefs.get(key, ''); } catch (err) { console.error('Load failed: ' + JSON.stringify(err)); return ''; } }3. 序列化复杂对象
// 保存对象 async function saveObject(context: Context, key: string, obj: Object): Promise<void> { const json = JSON.stringify(obj); await saveData(context, key, json); } // 读取对象 async function loadObject<T>(context: Context, key: string): Promise<T | null> { const json = await loadData(context, key); if (!json) return null; return JSON.parse(json) as T; }4. 与 RDB 对比
| 对比维度 | Preferences | RDB |
|---|---|---|
| 数据结构 | 键值对 | 关系表 |
| 查询能力 | 仅 key 查询 | SQL 查询 |
| 数据量 | 少量 | 大量 |
| 复杂度 | 简单 | 复杂 |
| 适用场景 | 设置、配置 | 历史记录 |
5. 完整代码文件索引
| 文件路径 | 说明 |
|---|---|
pages/FavoritesPage.ets | 收藏数据持久化 |
common/utils/Storage.ets | 存储工具类 |
6. 实现要点总结
Preferences 核心要点:
- getPreferences获取存储实例
- put/get读写数据
- flush()确保数据落盘
- JSON.stringify/parse序列化复杂对象
- try/catch异常处理
7. 总结
本文详细讲解了 HarmonyOS Preferences 数据持久化的完整实现,涵盖 API 使用、序列化、异常处理等核心知识点。
完整代码索引
| 文件路径 | 说明 |
|---|---|
| 本文涉及的代码文件 | 见正文 |
核心 API 参考
| API/组件 | 用途 | 文档链接 |
|---|---|---|
| 文中涉及的 API | 核心功能 | 华为官方文档 |
常见问题
Q1: 为什么会出现编译错误?A: 检查 import 路径是否正确,确认 API 版本兼容性。
Q2: 如何调试功能?A: 使用 hilog 打印日志,检查参数传递是否正确。
Q3: 运行时崩溃怎么办?A: 使用 try/catch 捕获异常,检查权限配置。
性能优化建议
- 异步操作使用 async/await 避免阻塞 UI
- 大量数据使用 LazyForEach 懒加载
- 图片资源压缩后再使用
- 缓存网络请求结果
- 及时释放不再使用的资源
安全注意事项
- 用户输入必须校验
- 敏感数据不要硬编码
- 网络请求使用 HTTPS
- 文件路径避免注入
- 权限最小化原则
扩展阅读
- HarmonyOS 官方文档提供了更详细的 API 说明
- 开源鸿蒙社区有丰富的示例代码
- 华为开发者论坛可以获取技术支持
总结
本文详细讲解了小分享 App 中对应功能的完整实现,涵盖 API 使用、代码示例、常见问题、性能优化等核心知识点。通过本文的学习,读者可以掌握 HarmonyOS 开发的完整流程。
本章小结
本文详细介绍了小分享 App 中对应功能的完整实现方案。通过本文的学习,读者可以掌握以下核心知识点:
- 功能的核心 API 使用方法和注意事项
- 完整的代码实现流程和最佳实践
- 常见问题的排查和解决方案
- 性能优化和安全建议
掌握这些知识后,读者可以独立实现类似功能,并应用到自己的 HarmonyOS 应用开发中。
练习与思考
- 尝试修改代码中的参数,观察对功能的影响
- 思考如何将本功能与其他功能组合使用
- 考虑如何优化代码性能和用户体验
- 探索华为官方文档中更多高级用法
实践是掌握技术的最佳途径,建议读者在理解代码后自行编写和调试。
完整代码文件索引
| 文件路径 | 说明 |
|---|---|
| 本文涉及的所有代码文件 | 见正文 |
核心 API 参考
| API/组件 | 用途 | 文档链接 |
|---|---|---|
| 本文涉及的核心 API | 功能实现 | 华为官方文档 |
常见问题排查
Q1: 编译错误A: 检查 import 路径是否正确,确认 API 版本兼容性,查看 hilog 日志。
Q2: 运行时异常A: 使用 try/catch 捕获异常,检查参数合法性,确认权限已配置。
Q3: 性能问题A: 避免在主线程执行耗时操作,使用异步 API,及时释放资源。
最佳实践总结
- 代码结构清晰,职责单一
- 错误处理完善,用户体验良好
- 性能优化到位,运行流畅
- 安全防护周全,数据可靠
- 文档注释完整,易于维护
总结
本文详细讲解了小分享 App 中对应功能的完整实现。通过本文的学习,读者可以掌握 HarmonyOS 开发的核心 API 使用方法和最佳实践,并能够独立实现类似功能。
- 敬请期待
总结
本文详细讲解了小分享 App 中对应功能的完整实现。通过本文的学习,读者可以掌握 HarmonyOS 开发的核心 API 使用方法和最佳实践,并能够独立实现类似功能。在实际开发中,建议读者结合官方文档深入理解每个 API 的参数含义和适用场景,并在项目中灵活运用。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!