【鴻蒙 HarmonyOS 4.0】數據持久化

一、數據持久化介紹

數據持久化是將內存數據(內存是臨時的存儲空間),通過文件或數據庫的形式保存在設備中。

HarmonyOS提供兩種數據持久化方案:

1.1、用戶首選項(Preferences):

通常用于保存應用的配置信息。數據通過文本的形式保存在設備中,應用使用過程中會將文本中的數據全量加載到內存中,所以訪問速度快、效率高,但不適合需要存儲大量數據的場景。

1.2、數據庫:

鍵值型數據庫(KV-Store):一種非關系型數據庫,其數據以“鍵值”對的形式進行組織、索引和存儲,其中“鍵”作為唯一標識符。適合很少數據關系和業務關系的業務數據存儲,同時因其在分布式場景中降低了解決數據庫版本兼容問題的復雜度,和數據同步過程中沖突解決的復雜度而被廣泛使用。相比于關系型數據庫,更容易做到跨設備跨版本兼容。

關系型數據庫(RelationalStore):一種關系型數據庫,以行和列的形式存儲數據,廣泛用于應用中的關系型數據的處理,包括一系列的增、刪、改、查等接口,開發者也可以運行自己定義的SQL語句來滿足復雜業務場景的需要。

二、通過用戶首選項實現數據持久化

使用場景:用戶首選項為應用提供Key-Value鍵值型的數據處理能力,支持應用持久化輕量級數據,并對其修改和查詢。

說明:

①Key鍵為string類型,要求非空且長度不超過80個字節。

②Value可以是string、number、boolean及以上類型數組,大小不超過8192字節

③數據量建議不超過一萬條

2.1、基本案例

2.1.1、案例代碼

@Entry
@Component
struct Index {@State message: string = '頁面列表'@State showPanel: boolean = false@Provide fontSize: number = 16build() {Column(){// 頂部標題this.Title()// 導航列表this.RouterList()// 字體修改面板if(this.showPanel){IndexFontSizePanel().transition({translate: { y: 115 }})}}.width('100%').height('100%')}@Builder Title(){Row() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).height(80)Image($r('app.media.ic_public_settings')).width(30).onClick(() => {animateTo({ duration: 500, curve: Curve.EaseOut }, () => this.showPanel = !this.showPanel)})}.justifyContent(FlexAlign.SpaceAround).width('100%')}@Builder RouterList() {List({ space: 15 }) {ForEach(['導航','屏幕','圖片','圖書','書架'],(item,index) => {ListItem() {Row(){Text((index+1) + '.').fontSize(this.fontSize).fontColor(Color.White)Blank()Text(item).fontSize(this.fontSize).fontColor(Color.White)}.width('90%').padding(12).backgroundColor('#38f').borderRadius(20).shadow({radius: 6, color: '#4F000000', offsetX: 2, offsetY: 4})}})}.layoutWeight(1).alignListItem(ListItemAlign.Center).width('100%')}
}@Component
struct IndexFontSizePanel {@Consume fontSize: numberfontSizLabel: object = {14: '小',16: '標準',18: '大',20: '特大',}build() {Column() {Text(this.fontSizLabel[this.fontSize]).fontSize(20)Row({ space: 5 }) {Text('A').fontSize(14).fontWeight(FontWeight.Bold)Slider({min: 14,max: 20,step: 2,value: this.fontSize}).showSteps(true).trackThickness(6).layoutWeight(1).onChange(val => {// 修改字體大小this.fontSize = val})Text('A').fontSize(20).fontWeight(FontWeight.Bold)}.width('100%')}.width('100%').padding(15).backgroundColor('#fff1f0f0').borderRadius(20)}
}

2.1.2、案例效果:

案例說明:

這是一個頁面列表展示案例,點擊右上角的設置按鈕,底部會彈出字體修改面板,字體有4個不同的大小(小/標準/大/特大),當點擊滑動條可以修改字體大小

目前更改了滑動條的字體大小數據是保存在內存的,關閉頁面后再進來數據顯示默認大小,現在是想通過用戶首選項實現數據持久化,持久化保存設置的字體大小

2.2、具體實現

2.2.1、定義用戶首選項操作文件

import preferences from '@ohos.data.preferences';class PreferencesUtil{prefMap: Map<string, preferences.Preferences> = new Map()async loadPreference(context, name: string){try { // 加載preferenceslet pref = await preferences.getPreferences(context, name)this.prefMap.set(name, pref)console.log('testTag', `加載Preferences[${name}]成功`)} catch (e) {console.log('testTag', `加載Preferences[${name}]失敗`, JSON.stringify(e))}}async putPreferenceValue(name: string, key: string, value: preferences.ValueType){if (!this.prefMap.has(name)) {console.log('testTag', `Preferences[${name}]尚未初始化!`)return}try {let pref = this.prefMap.get(name)// 寫入數據await pref.put(key, value)// 刷盤await pref.flush()console.log('testTag', `保存Preferences[${name}.${key} = ${value}]成功`)} catch (e) {console.log('testTag', `保存Preferences[${name}.${key} = ${value}]失敗`, JSON.stringify(e))}}async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType){if (!this.prefMap.has(name)) {console.log('testTag', `Preferences[${name}]尚未初始化!`)return}try {let pref = this.prefMap.get(name)// 讀數據let value = await pref.get(key, defaultValue)console.log('testTag', `讀取Preferences[${name}.${key} = ${value}]成功`)return value} catch (e) {console.log('testTag', `讀取Preferences[${name}.${key} ]失敗`, JSON.stringify(e))}}
}const preferencesUtil = new PreferencesUtil()export default preferencesUtil as PreferencesUtil

2.2.2、將數據加載到Preferences實例,用于數據操作。

放入應用啟動時來操作,找到EntryAbility文件,在onCreate應用創建時,加載Preferences實例

2.2.3、Index頁面使用

第一步:一進入首頁就進行讀取

使用頁面生命周期aboutToAppear來執行

第二步:修改字體大小時寫入Preferences

最后:👏👏😊😊😊👍👍?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 全局異常處理封裝

app出現了問題&#xff0c;尤其是多線程問題&#xff0c;某個線程出了問題&#xff0c;很不好找&#xff0c;那是不是可以搞一個統一的處理類&#xff0c;將所有的異常信息都統一到一個地方呢&#xff0c;原本只是一個知識點&#xff0c;但我發現這里還可以 保存異常信息到本地…

Vue 進階系列丨實現簡易reactive和ref

Vue 進階系列教程將在本號持續發布&#xff0c;一起查漏補缺學個痛快&#xff01;若您有遇到其它相關問題&#xff0c;非常歡迎在評論中留言討論&#xff0c;達到幫助更多人的目的。若感本文對您有所幫助請點個贊吧&#xff01; 2013年7月28日&#xff0c;尤雨溪第一次在 GItHu…

計算機網絡Day02--物理層(一)

計算機網絡Day02–物理層 物理層基本概念 物理層考慮的是怎么才能在連接各種計算機的傳輸媒體上傳輸比特流&#xff0c;而不是具體的傳輸媒體 作用&#xff1a;盡可能屏蔽掉不同傳輸媒體和通信手段的差異 用于物流層的協議也稱為物流層規程 主要作用&#xff1a;解決計算機…

COCI2015-2016#1 RELATIVNOST

P6533 [COCI2015-2016#1] RELATIVNOST 題目大意 小 L L L在賣畫。這些畫分為彩色畫和黑白畫&#xff0c;小 L L L希望有至少 c c c個人會買走他至少一張彩色畫。 第 i i i個人至多會購買 a i a_i ai?張彩色畫或者 b i b_i bi?張黑白畫&#xff0c;且每個人至少購買一張畫。…

Android---Jetpack Compose學習007

Compose 附帶效應 a. 純函數 純函數指的是函數與外界交換數據只能通過函數參數和函數返回值來進行&#xff0c;純函數的運行不會對外界環境產生任何的影響。比如下面這個函數&#xff1a; fun Add(a : Int, b : Int) : Int {return a b } “副作用”&#xff08;side effe…

單例模式的介紹

單例模式&#xff08;Singleton&#xff09;是一種創建型設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。其核心思想是通過限制類的實例化次數&#xff0c;防止多個實例同時存在&#xff0c;從而避免了多線程競爭和資源浪費&#xff0c;提高了代碼…

【藍橋杯單片機入門記錄】靜態數碼管

目錄 一、數碼管概述 &#xff08;1&#xff09;認識數碼管 &#xff08;2&#xff09;數碼管的工作原理 &#xff08;3&#xff09;LED數碼管驅動方式-靜態顯示 二、數碼管電路圖 三、靜態數碼管顯示例程 &#xff08;1&#xff09;例程1&#xff1a;數碼管顯示某一位&a…

vue、thinkphp實現騰訊云對象存儲COS圖片上傳

環境&#xff1a; thinkphp6 vue2 vant2.12 composer安裝qcloud-sts-sdk composer require qcloud_sts/qcloud-sts-sdk獲取COS臨時id、key的sts接口 <?php declare (strict_types 1);namespace app\index\controller; use QCloud\COSSTS\Sts;class CosController {//h…

如何為PostgreSQL設置自增主鍵?

在 PostgreSQL 中&#xff0c;自增主鍵通常是通過使用 SERIAL 類型或在新版本中使用 IDENTITY 列來實現的。 1. 使用 SERIAL 類型 SERIAL 是一個自動增加的整數&#xff0c;常用于主鍵。當插入新的行時&#xff0c;PostgreSQL 會自動為這個列生成一個新的值。 ??例如 CREAT…

PYQT5-自定義事件

from PyQt5.QtCore import QEvent, QObject from PyQt5.QtWidgets import QApplication import sys# 自定義事件類 class CustomEvent(QEvent):# PYQT5 預留給用戶自定義事件類型的起點為 QEvent.User1000custom_event_type QEvent.registerEventType()# 也可以這樣寫# custom…

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//標記數組 int a[N][N];//儲存數組 int dx[] { -1…

webstorm光標變成方塊解決辦法_webstorm光標變粗不能換行

webstorms光標變了 鍵盤上的insert是切換的快捷鍵&#xff0c;敲insert就可以來回切換了

回顧 | Java面向對象 多態篇

多態是面向對象編程中的一個重要概念&#xff0c;它允許不同的對象對同一消息做出不同的響應。 通過多態&#xff0c;可以通過父類或接口定義的引用變量來操作子類或實現類的對象&#xff0c;從而實現同一方法在不同對象上的不同行為。 在Java中&#xff0c;多態性主要通過繼…

雙通道并行網絡,想用哪個網絡用哪個,MATLAB代碼

本期可謂是寶藏篇&#xff01;學會本期的思想&#xff0c;幫助你分分鐘找到創新點&#xff0c;且不與別人重復&#xff01; 本期采用MATLAB代碼&#xff0c;實現一種“基于格拉姆角場與并行CNN的故障診斷方法”。該方法的具體實現可以參考文獻&#xff1a; [1]李宗源,陳謙,錢…

React native更改包名后,啟動app的activity包名不生效問題

這篇文章本不算記錄的&#xff0c;因為實際開發中&#xff0c;類似這種小問題會有很多很多&#xff0c;因為導致問題的原因千奇百怪&#xff0c;解決方案也不盡相同&#xff0c;所以也都沒有記錄。 但今天看到我10年寫的問題解決小文章&#xff0c;被網友收藏了&#xff0c; 感…

普中51單片機學習(EEPROM)

EEPROM IIC串行總線的組成及工作原理 I2C總線的數據傳送 數據位的有效性規定 I2C總線進行數據傳送時&#xff0c;時鐘信號為高電平期間&#xff0c;數據線上的數據必須保持穩定&#xff0c;只有在時鐘線上的信號為低電平期間&#xff0c;數據線上的高電平或低電平狀態才允許…

分享WebGL物體三維建模

界面效果 代碼結構 模型素材類似CT (Computed Tomography)&#xff0c;即電子計算機斷層掃描&#xff0c;它是利用精確準直的X線束、γ射線、超聲波等&#xff0c;與靈敏度極高的探測器一同圍繞物體的某一部位作一個接一個的斷面掃描。 坐標系統 渲染流程 渲染流程是個將之前準…

Sora:OpenAI引領AI視頻新時代

Sora - 探索AI視頻模型的無限可能 隨著人工智能技術的飛速發展&#xff0c;AI視頻模型已成為科技領域的新熱點。而在這個浪潮中&#xff0c;OpenAI推出的首個AI視頻模型Sora&#xff0c;以其卓越的性能和前瞻性的技術&#xff0c;引領著AI視頻領域的創新發展。讓我們將一起探討…

C++(12) 模板類、模板繼承(嚴格模式和自由模式)

文章目錄 模版類1. 模版類2. 模版參數限制3. 模版繼承3.1 嚴格模式3.2 自由模式 4. 模版類的模版函數5. 返回值類型帶有模版 模版類 1. 模版類 #include <iostream>using namespace std;/* 當前 Person 類型&#xff0c;聲明了連個模版分別對應NameType 模版類型&#…

C++ array容器用法詳解

array 容器是 C++ 11 標準中新增的序列容器,簡單地理解,它就是在 C++ 普通數組的基礎上,添加了一些成員函數和全局函數。在使用上,它比普通數組更安全(原因后續會講),且效率并沒有因此變差。 和其它容器不同,array 容器的大小是固定的,無法動態的擴展或收縮,這也就意…