【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt

在移动应用开发中,数据存储是一个至关重要的环节。对于使用UniApp开发的Android应用来说,缓存(Cache)是一种常见的数据存储方式,它能够提高应用的性能和用户体验。然而,缓存数据在用户清除缓存或清除应用数据后会被删除。如果你的应用需要在这些操作后仍然保留某些关键数据,就需要考虑其他持久化存储方案。

uniapp调用示例传送门

本文将介绍如何利用H5plus的native功能,通过引入Java类,将数据存储到本地文件中,从而实现数据的持久化。

目录

    • 为什么选择本地文件存储?
    • 实现步骤
      • 1. 引入必要的Java类
      • 2. 读取本地文件
      • 3. 写入本地文件
      • 4. 权限设置
    • 总结

为什么选择本地文件存储?

在UniApp中,数据通常以缓存的形式存储在本地。这种方式虽然简便且高效,但存在一个明显的缺点:缓存数据容易被用户清除。当用户在应用设置中清除缓存或清除应用数据时,所有缓存的数据都会丢失。如果你的应用需要保留一些关键数据,例如用户设置、配置信息或重要的用户数据,那么就需要一种更持久的数据存储方式。

本地文件存储提供了一种可靠的解决方案。通过将数据写入设备的文件系统中,即使缓存被清除,这些文件依然存在,数据得以保留。

实现步骤

1. 引入必要的Java类

由于我们需要在Android环境中操作文件系统,因此需要使用Java的IO类。通过H5plus的plus.android.importClass方法,我们可以导入这些类:

const File = plus.android.importClass('java.io.File');
const BufferedReader = plus.android.importClass('java.io.BufferedReader');
const FileReader = plus.android.importClass('java.io.FileReader');
const FileWriter = plus.android.importClass('java.io.FileWriter');

2. 读取本地文件

以下是一个读取本地JSON文件的函数:

function readJsonByFile(fileNamePath) {const readFr = new File(fileNamePath);try {const reader = new BufferedReader(new FileReader(readFr));let txt;let retxt = '';let flag = true;while (flag) {txt = reader.readLine(); // 读取文件if (txt == null) {flag = false;break;}retxt += txt;}return retxt;} catch (e) {console.log(e);return '';}
}

使用示例

const settingJsonPath = '/storage/emulated/0/Download/你的文件夹/配置.json';
const jsonData = readJsonByFile(settingJsonPath);
console.log(jsonData);

3. 写入本地文件

以下是一个写入本地JSON文件的函数:

function writeJsonToFile(json, fileNamePath) {try {// 创建目录const n = fileNamePath.lastIndexOf('/');if (n !== -1) {const fileDirs = fileNamePath.substring(0, n);console.log(fileDirs);const directory = new File(fileDirs);if (!directory.exists()) {const a = directory.mkdirs(); // 不存在创建目录console.log(a);}}// 创建文件const file = new File(fileNamePath);if (!file.exists()) {file.createNewFile(); // 创建文件}// 写入文件const fos = new FileWriter(fileNamePath, false);fos.write(json);fos.close();return true;} catch (e) {console.log(e);return false;}
}

使用示例

const settingJsonPath = '/storage/emulated/0/Download/你的文件夹/配置.json';
const jsonData = {"主键": "值","数组": [1, 2, 3],"嵌套对象": {"子键": "子值"}
};
const success = writeJsonToFile(JSON.stringify(jsonData), settingJsonPath);
if (success) {console.log("文件写入成功");
} else {console.log("文件写入失败");
}

4. 权限设置

在Android 6.0(API 23)及以上版本,存储权限需要动态申请。即使你在manifest中声明了存储权限,用户仍然需要在运行时授予权限。以下是申请存储权限的示例:

// 请求存储权限
plus.android.requestPermissions(["android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"],function(e) {if (e.granted) {console.log("权限已授予");} else {console.log("权限被拒绝");}},function(e) {console.log("请求权限失败");}
);

在这里插入图片描述

注意事项

  • 路径选择:从Android 11(API 30)开始,访问外部存储的规则有所变化。建议使用应用专属的目录,例如/storage/emulated/0/Android/data/你的包名/files/,以避免权限问题。
  • 错误处理:在实际应用中,建议添加更多的错误处理逻辑,例如处理文件不存在、读写失败等情况。
  • 数据格式:确保写入和读取的数据格式一致,避免因格式不匹配导致的数据解析错误。

总结

通过将数据存储在本地文件中,你可以确保关键数据在用户清除缓存或清除应用数据后依然存在。这种方法不仅适用于UniApp,也适用于其他跨平台开发框架。关键在于合理利用原生功能,处理好权限和文件路径问题。

希望本文能帮助你更好地实现UniApp应用的持久化存储,提升用户体验和数据安全性。如果你有任何疑问或建议,欢迎在评论区留言交流!

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

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

相关文章

【Excel】 Power Query抓取多页数据导入到Excel

抓取多页数据想必大多数人都会,只要会点编程技项的人都不会是难事儿。那么,如果只是单纯的利用Excel软件,我还真的没弄过。昨天,我就因为这个在网上找了好久发好久。 1、在数据-》新建查询-》从其他源-》自网站 ,如图 …

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

let、const【ES6】

‌“我唯一知道的就是我一无所知。” - 苏格拉底 目录 块级作用域:var、let、const的对比:Object.freeze(): 块级作用域: 块级作用域指由 {} 包围的代码块(如 if、for、while、单独代码块等)形成的独立作用…

C++ 常见面试知识点

主要介绍C常见面试题 1、说一下你理解的C中的四种智能指针 常用接口 T* get(); T& operator*(); T* operator->(); T& operator(const T& val); T* release(); 将 封装在内部的指针置为nullptr, 但并不会破坏指针所指向的内容, 函 数返回的是内部指针置空之前…

AWS API Gateway灰度验证实现

在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…

基于coze+微信小程序实现图片上传并利用大模型解析

项目截图&#xff1a; 实现代码&#xff08;直接搬去可用&#xff09; 前提&#xff1a;需要填写你的oss配置coze的api授权配置&#xff01;&#xff01;&#xff01; <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了&#xff0c;以后要彻底告别1.x和2.x了&#xff0c;同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于…

jQuery UI API 文档

jQuery UI API 文档 引言 jQuery UI 是一个基于 jQuery 的用户界面库,它提供了丰富的交互式组件和效果,使得网页开发变得更加简单和高效。本文档旨在为开发者提供全面的 jQuery UI API 信息,帮助您更好地理解和应用 jQuery UI。 jQuery UI 简介 什么是 jQuery UI? jQu…

java GUI编程实现一个计算器

概述 闲来无事&#xff0c;利用java awt库写个简单的计算器玩玩。 实现 pom.xml <dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version></dependency&…

C#装箱拆箱机制详解

在C#中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09; 是值类型与引用类型之间转换的核心机制。它们的实现直接影响程序的性能和类型安全。 一、装箱&#xff08;Boxing&#xff09; 定义&#xff1a; 将值类型转换为引用类型&#…

MySQL 8.4 SQL 全攻略:所有知识点与实战场景

一、引言 MySQL 作为一款广泛使用的开源关系型数据库管理系统&#xff0c;在数据存储和管理领域占据着重要地位。MySQL 8.4 版本在性能、功能和安全性等方面都有了显著的提升。本文将全面介绍 MySQL 8.4 中 SQL 的各种知识点&#xff0c;并结合实战场景进行详细讲解&#xff0…

Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载

一、前言说明 在做这个功能的时候&#xff0c;着实费了点心思&#xff0c;好在之前做ffmpeg加密解密的时候&#xff0c;已经打通了极速加密保存文件&#xff0c;主要就是之前的类中新增了进度提示信号&#xff0c;比如当前已经处理到哪个position位置&#xff0c;发个信号出来…

超高速工业相机的应用

超高速工业相机一般安装在机器流水线上代替人眼来做测量和判断&#xff0c;通过数字图像摄取目标转换成图像信号&#xff0c;传送给专用的图像处理系统。图像处理系统对这些信号进行各种运算来抽取目标的特征&#xff0c;进而根据判别的结果来控制现场的设备动作。一般来说&…

Plugin ‘mysql_native_password‘ is not loaded`

Plugin ‘mysql_native_password’ is not loaded mysql_native_password介绍1. 使用默认的认证插件2. 修改 my.cnf 或 my.ini 配置文件3. 加载插件&#xff08;如果确实没有加载&#xff09;4. 重新安装或检查 MySQL 版本 遇到错误 ERROR 1524 (HY000): Plugin mysql_nativ…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…

【工具】前端 js 判断当前日期是否在当前自然周内

【工具】前端 js 判断当前日期是否在当前自然周内 function isCurrentNaturalWeek(targetDate) {const today new Date();const dayOfWeek today.getDay(); // 0&#xff08;周日&#xff09;到6&#xff08;周六&#xff09;// 计算本周一的日期&#xff08;自然周从周一开…

【操作系统】处理机调度

处理机调度 一、调度的概念、层次1.1 三个层次1.2 七状态模型 二、调度算法的评价指标2.1 CPU利用率2.2 系统吞吐率2.3 周转时间2.4 等待时间2.5 响应时间 三、进程调度&#xff08;低级调度&#xff09;的时机3.1 需要进程调度的情况3.2 不能进程调度的情况3.3 闲逛进程 四、进…

SpringBoot 使用 spring.profiles.active 来区分不同环境配置

很多时候&#xff0c;我们项目在开发环境和生产环境的配置是不一样的&#xff0c;例如&#xff0c;数据库配置&#xff0c;在开发的时候&#xff0c;我们一般用测试数据库&#xff0c;而在生产环境&#xff0c;我们要用生产数据库&#xff0c;这时候&#xff0c;我们可以利用 p…

怎么进行mysql的优化?

MySQL 的优化是一个系统性的工作&#xff0c;涉及多个层面&#xff0c;包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法&#xff1a; 查询优化 避免全表扫描&#xff1a;确保查询能够使用索引&#xff0c;避免 SELECT *&#xff0c;只选择需要…

谈谈 Node.js 中的模块系统,CommonJS 和 ES Modules 的区别是什么?

Node.js 模块系统&#xff1a;CommonJS 和 ES Modules 核心差异与实战指南 一、模块系统基础概念 **CommonJS (CJS)**​ 是 Node.js 传统模块系统&#xff0c;采用同步加载方式&#xff0c;典型特征&#xff1a; // 导出 module.exports { name: cjs }; // 或 exports.nam…