【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.pswp.cn/bicheng/72064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72064.shtml
英文地址,請注明出處:http://en.pswp.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…