鴻蒙應用開發中的數據存儲:SQLite與Preferences全面解析

在鴻蒙(HarmonyOS)應用開發中,數據存儲是構建功能完整、用戶體驗良好的應用程序的關鍵環節。鴻蒙系統提供了多種數據存儲解決方案,其中SQLite數據庫和Preferences(偏好設置)是最常用的兩種方式。本文將深入探討這兩種存儲技術的使用場景、實現方法以及最佳實踐,幫助開發者根據應用需求選擇最合適的存儲方案。

一、數據存儲概述

在移動應用開發中,數據存儲通常分為以下幾種類型:

  1. 輕量級鍵值存儲:如Preferences,適合存儲簡單的配置信息

  2. 結構化數據存儲:如SQLite,適合存儲復雜的關系型數據

  3. 文件存儲:適合存儲大容量非結構化數據

  4. 云存儲:用于需要跨設備同步的數據

鴻蒙系統為開發者提供了全面的數據存儲API,其中Preferences和SQLite因其易用性和高效性成為最常用的本地存儲方案。

二、Preferences(偏好設置)詳解

2.1 Preferences簡介

Preferences是鴻蒙提供的一種輕量級數據存儲解決方案,它以鍵值對的形式存儲數據,適用于保存用戶偏好設置、應用配置信息等小規模數據。

核心特點:

  • 采用XML文件格式存儲

  • 線程安全

  • 支持基本數據類型(String、int、boolean等)

  • 數據量不宜過大(建議不超過1MB)

2.2 Preferences實現方法

2.2.1 初始化Preferences

import ohos.data.preferences.Preferences;// 獲取Preferences實例
// 參數1:上下文對象
// 參數2:存儲文件名(無需后綴)
Preferences preferences = PreferencesHelper.getPreferences(context, "user_settings");

2.2.2 數據存取操作

存儲數據:

// 存儲不同類型的數據
preferences.putString("username", "鴻蒙開發者");
preferences.putInt("login_count", 5);
preferences.putBoolean("is_first_launch", false);
preferences.putFloat("font_size", 16.0f);
preferences.putLong("last_login_time", System.currentTimeMillis());// 提交保存(同步寫入磁盤)
preferences.flush();

讀取數據:

// 讀取數據(第二個參數為默認值)
String username = preferences.getString("username", "");
int loginCount = preferences.getInt("login_count", 0);
boolean isFirstLaunch = preferences.getBoolean("is_first_launch", true);
float fontSize = preferences.getFloat("font_size", 14.0f);
long lastLoginTime = preferences.getLong("last_login_time", 0L);

刪除數據:

// 刪除單個鍵值
preferences.delete("username");// 清空所有數據
preferences.clear();

2.3 Preferences最佳實踐

  1. 合理組織鍵名:使用有意義的命名,如"user_pref_theme_color"而非簡單的"color"

  2. 避免存儲大對象:不適合存儲圖片、大文本等數據

  3. 及時flush:重要數據操作后立即調用flush()確保數據持久化

  4. 分組管理:不同模塊的配置使用不同的Preferences文件

  5. 加密敏感數據:對于密碼等敏感信息應先加密再存儲

三、SQLite數據庫詳解

3.1 SQLite簡介

SQLite是鴻蒙內置的輕量級關系型數據庫,具有以下特點:

  • 無需服務器,零配置

  • 支持標準SQL語法

  • 支持事務處理

  • 單文件存儲

  • 適合存儲結構化數據

3.2 SQLite實現方法

3.2.1 創建數據庫幫助類

import ohos.data.rdb.*;public class UserDBHelper extends RdbOpenHelper {private static final String DB_NAME = "user_db";private static final int DB_VERSION = 2;// 用戶表SQLprivate static final String CREATE_TABLE_USER = "CREATE TABLE IF NOT EXISTS user (" +"id INTEGER PRIMARY KEY AUTOINCREMENT, " +"name TEXT NOT NULL, " +"age INTEGER DEFAULT 0, " +"email TEXT UNIQUE, " +"create_time TEXT DEFAULT (datetime('now','localtime')))";public UserDBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}@Overridepublic void onCreate(RdbStore store) {// 創建初始表結構store.executeSql(CREATE_TABLE_USER);}@Overridepublic void onUpgrade(RdbStore store, int oldVersion, int newVersion) {// 數據庫升級邏輯if (oldVersion < 2) {// 版本2新增address字段store.executeSql("ALTER TABLE user ADD COLUMN address TEXT");}}
}

3.2.2 初始化數據庫

// 數據庫配置
StoreConfig config = StoreConfig.newDefaultConfig("user_db.db");
// 設置是否加密
config.setEncryptKey("your_encryption_key".getBytes());// 初始化數據庫
UserDBHelper helper = new UserDBHelper(context);
RdbStore rdbStore = helper.getRdbStore(config);

3.2.3 CRUD操作實現

1. 插入數據

ValuesBucket values = new ValuesBucket();
values.putString("name", "李四");
values.putInteger("age", 28);
values.putString("email", "lisi@example.com");
values.putString("address", "北京市海淀區");long newId = rdbStore.insert("user", values);

2. 查詢數據

// 構建查詢條件
RdbPredicates predicates = new RdbPredicates("user").greaterThan("age", 20).orderByAsc("name").limit(10).offset(0);// 指定返回列
String[] columns = {"id", "name", "age", "email", "address"};// 執行查詢
ResultSet resultSet = rdbStore.query(predicates, columns);// 處理結果集
List<User> userList = new ArrayList<>();
while (resultSet.goToNextRow()) {User user = new User();user.setId(resultSet.getInt(0));user.setName(resultSet.getString(1));user.setAge(resultSet.getInt(2));user.setEmail(resultSet.getString(3));user.setAddress(resultSet.getString(4));userList.add(user);
}
resultSet.close();

3. 更新數據

ValuesBucket updateValues = new ValuesBucket();
updateValues.putInteger("age", 29);RdbPredicates updatePredicates = new RdbPredicates("user").equalTo("email", "lisi@example.com");int updatedRows = rdbStore.update(updateValues, updatePredicates);

4. 刪除數據

RdbPredicates deletePredicates = new RdbPredicates("user").lessThanOrEqualTo("age", 18);int deletedRows = rdbStore.delete(deletePredicates);

3.2.4 事務處理

rdbStore.beginTransaction();
try {// 批量插入數據for (User user : userList) {ValuesBucket values = new ValuesBucket();values.putString("name", user.getName());// 設置其他字段...rdbStore.insert("user", values);}// 標記事務成功rdbStore.markAsCommit();
} catch (Exception e) {// 發生異常回滾事務rdbStore.markAsRollback();throw e;
} finally {// 結束事務rdbStore.endTransaction();
}

3.3 SQLite最佳實踐

  1. 合理設計表結構:遵循數據庫規范化原則

  2. 使用索引優化查詢:對頻繁查詢的字段創建索引

  3. 避免在主線程操作數據庫:使用線程池或異步任務

  4. 處理數據庫升級:妥善管理onUpgrade邏輯

  5. 使用預編譯語句:提高頻繁操作的性能

  6. 定期維護數據庫:如VACUUM操作減少碎片

四、SQLite與Preferences對比選型

特性PreferencesSQLite
存儲類型鍵值對關系型表格
適合場景簡單配置/用戶偏好復雜結構化數據
查詢能力簡單鍵值查找強大SQL查詢
數據量小(KB級)大(GB級)
性能極高
線程安全需要自行管理
加密支持有限支持完整加密
學習曲線簡單中等

選型建議:

  • 選擇Preferences:用戶主題設置、應用開關狀態、簡單的計數器等

  • 選擇SQLite:用戶通訊錄、聊天記錄、商品目錄等復雜數據

五、安全注意事項

  1. 敏感數據加密:無論是Preferences還是SQLite,存儲密碼等敏感信息前必須加密

  2. 數據庫加密:使用setEncryptKey()方法加密SQLite數據庫

  3. 文件權限控制:確保數據文件不被其他應用訪問

  4. 輸入驗證:防止SQL注入攻擊

  5. 定期備份:重要數據應實現備份機制

六、總結

鴻蒙系統提供的Preferences和SQLite兩種存儲方案各有優勢,開發者應根據實際需求選擇合適的方案。Preferences操作簡單、性能極高,適合存儲少量簡單數據;SQLite功能強大、查詢靈活,適合管理復雜結構化數據。

在實際開發中,我們常常會同時使用這兩種存儲方式:用Preferences保存應用配置和用戶偏好,用SQLite管理應用的核心業務數據。掌握這兩種存儲技術,能夠為鴻蒙應用開發提供堅實的數據持久化支持。

隨著鴻蒙生態的不斷發展,數據存儲技術也將持續演進。建議開發者定期關注鴻蒙官方文檔,了解最新的存儲API和改進特性,以構建更高效、更安全的鴻蒙應用程序。

?

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

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

相關文章

夏至之日,共赴實時 AI 之約:RTE Open Day@AGI Playground 2025 回顧

每年 RTE 開發者社區的重磅活動—— RTE Open Day &#xff0c;也在六月的 AGI Playground 現場開啟今年的行程。這是 RTE Open Day 第五期現場&#xff0c;這期我們的關鍵詞是 「Real-Time AI」 和 「Voice Agent」&#xff0c;不僅有來自社區的 16 個項目&#xff0c;還有兩場…

Tomcat性能調優指南

文章目錄 一、Tomcat性能調優概述為什么需要調優Tomcat&#xff1f; 二、Tomcat架構與性能關鍵點三、JVM調優1. 內存配置優化2. 垃圾回收優化3. 其他JVM優化參數 四、連接器(Connector)調優1. NIO vs APR/Native2. 高級NIO配置 五、線程池優化六、會話管理優化1. 會話超時配置2…

Swift 小技巧:用單邊區間優雅處理模糊范圍

進入正題之前先科普一下 Swift 區間的知識。 Swift 中的區間有兩種類型&#xff1a;閉區間和半開區間。 閉區間&#xff1a;用 a...b 表示&#xff0c;包含 a 和 b。半開區間&#xff1a;用 a..<b 表示&#xff0c;包含 a 但不包含 b。 舉個例子 想判斷一個數字是否在 0 …

Tang Prime 20K板OV2640例程

準備用Tang Prime 20K開發板進行OV2640攝像頭采集驗證。 Tang Primer 20K是由開源硬件廠商SiPEED矽速科技推出&#xff0c;是一款以 GW2A-LV18PG256C8/I7 為主芯片的核心板&#xff0c;準備了 2 個擴展板&#xff0c;Dock 和 Lite。板卡包含有HDMI輸出&#xff0c;DVP接口&…

基于Anaconda環境開發IntelliJ IDEA實用JSON轉Java實體插件

在軟件開發中&#xff0c;將JSON數據轉換為Java實體類是常見需求。借助Anaconda環境強大的包管理能力與IntelliJ IDEA的插件開發體系&#xff0c;我們可以打造一款高效實用的JSON轉Java實體插件&#xff0c;顯著提升開發效率。下面將從需求分析、技術選型、開發實現到優化部署&…

idea運行到遠程機器 和 idea遠程JVM調試

一、idea運行到遠程機器 適用場景&#xff0c;本地連接不上遠程機器的部分組件&#xff0c;如&#xff1a;redis、數據庫。 缺點&#xff1a;每次修改程序&#xff0c;會復制所有的 依賴和class 啟動比較慢。 工作原理&#xff1a;遠程機器和本機器&#xff0c;都會啟動一個端口…

微信小程序接入騰訊云短信驗證碼流程

以下是針對 AA公司微信小程序接入騰訊云短信驗證碼 的 全流程操作指南&#xff0c;包含資質申請、簽名/模板配置、代碼對接的完整解決方案&#xff1a; 一、資質申請&#xff08;必須通過審核才能發短信&#xff09; 1?? 進入資質管理頁 路徑&#xff1a;騰訊云控制臺 → 短…

阿里云OSS文件上傳完整實現方案

一、前言 阿里云對象存儲服務(OSS)是一種海量、安全、低成本、高可靠的云存儲服務。本文將詳細介紹如何在Spring Boot項目中集成阿里云OSS實現文件上傳功能。 二、準備工作 1. 獲取OSS配置信息 在開始前&#xff0c;您需要準備以下OSS配置信息&#xff1a; endpoint: OSS服…

【軟考--軟件設計師】10.2 關系型數據庫

10 模式分解 分解 模式分解:將一個關系模式分解為多個子模式 模式分解就是模式規范化的工具&#xff0c;模式分解使用無損連接和保持函數依賴來衡量模式分解后是否導致原有模式中部分信息丟失。 無損連接 保持函數依賴 11、事務管理 事務的ACID性質: (1)原子性(Atomicit…

python訓練day44 預訓練模型

預訓練模型發展史 預訓練模型的訓練策略 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt# 設置中文字體支持 plt.rcParams["…

[論文閱讀]MISSRce

論文title: MISSRec: Pre-training and Transferring Multi-modal Interest-aware Sequence Representation for Recommendation

Redis學習筆記——黑馬點評 附近商鋪到UV統計 完結

前言&#xff1a; 今天完結了Redis的所有實戰篇。 學習收獲&#xff1a; GEO數據結構&#xff1a; GEO就是Geolocation的簡寫形式&#xff0c;代表地理坐標。Redis在3.2版本中加入對Geo的支持&#xff0c;存儲、管理和操作地理空間數據的特殊數據結構&#xff0c;它能高效處…

【客戶端排查】mac電腦怎么查看客戶端的實時運行日志

先退出客戶端&#xff1b;打開訪達里的應用程序&#xff1b; 打開【顯示包內容】&#xff1b; 找到MacOS 雙擊里面的終端程序&#xff1b; 雙擊后&#xff0c;客戶端會自動啟動&#xff0c;且可以在終端中查看客戶端的實時日志啦~

HarmonyOS NEXT倉頡開發語言實戰案例:健身App

各位好&#xff0c;今日分享一個健身app的首頁&#xff1a; 這個頁面看起比之前的案例要稍微復雜一些&#xff0c;主要在于頂部部分&#xff0c;有重疊的背景&#xff0c;還有偏移的部分。重疊布局可以使用Stack容器實現&#xff0c;超出容器范圍的偏移可以使用負數間距來實現&…

TreeMap源碼分析 紅黑樹

今天嘗試刨一下TreeMap的祖墳。 底層結構對比 先來看一下與HashMap、LinkedHashMap和TreeMap的對比&#xff0c;同時就當是復習一下&#xff1a; HashMap使用數組存儲數據&#xff0c;并使用單向鏈表結構存儲hash沖突數據&#xff0c;同一個沖突桶中數據量大的時候&#xff…

華為云Flexus+DeepSeek征文|基于Dify構建拍照識題智能學習助手

華為云FlexusDeepSeek征文&#xff5c;基于Dify構建拍照識題智能學習助手 一、構建拍照識題智能學習助手前言二、構建拍照識題智能學習助手環境2.1 基于FlexusX實例的Dify平臺2.2 基于MaaS的模型API商用服務 三、構建拍照識題智能學習助手實戰3.1 配置Dify環境3.2 配置Dify工具…

題解:CF2120E Lanes of Cars

根據貪心&#xff0c;不難想到每次會把最長隊伍末尾的那輛車移動到最短隊伍的末尾。但由于 k k k 的存在&#xff0c;會導致一些冗余移動的存在。設需要挪動 C C C 輛車&#xff0c;則怒氣值可以表示為 f ( C ) k C f(C) kC f(C)kC&#xff0c;其中 f ( C ) f(C) f(C) 是…

Excel基礎:選擇和移動

本文演示Excel中基礎的選擇和移動操作&#xff0c;并在最后提供了一張思維導圖&#xff0c;方便記憶。 文章目錄 一、選擇1.1 基礎選擇1.1.1 選擇單個單元格1.1.2 選擇連續范圍 1.2 行列選擇1.2.1 選擇整行整列1.2.2 選擇多行多列 1.3 全選1.3.1 全選所有單元格1.3.2 智能選擇…

Java面試寶典:基礎四

80. int vs Integer 維度intInteger類型基本數據類型(8種之一)包裝類默認值0null應用場景性能敏感場景(計算密集)Web表單、ORM框架(區分null和0)特殊能力無提供工具方法(如parseInt())和常量(如MAX_VALUE)示例:

RabbitMQ + JMeter 深度集成指南:中間件性能優化全流程解析!

在 2025 年的數字化浪潮中&#xff0c;中間件性能直接決定系統的穩定性和用戶體驗&#xff0c;而 RabbitMQ 作為消息隊列的“老大哥”&#xff0c;在分布式系統中扮演著關鍵角色。然而&#xff0c;高并發場景下&#xff0c;消息堆積、延遲激增等問題可能讓系統不堪重負&#xf…