鴻蒙5.0項目開發——鴻蒙天氣項目的實現(歡迎頁)

【高心星出品】

文章目錄

      • 歡迎頁面效果
      • 數據字典
      • 創建數據庫表格
      • Splash頁面
        • 頁面功能
        • 歡迎頁代碼
        • 亮點

項目按照從數據庫連接層–視圖層–業務邏輯層這種三層架構開發,所以先設計了數據庫表格的結構,在EntryAbility中創建表格。

歡迎頁面效果

在這里插入圖片描述

數據字典

  • searchmodel的數據字典:
/***** 搜索歷史記錄模型*** 用于存儲用戶搜索關鍵詞的歷史記錄***/*export interface SearchHistoryItem {id?: number     *// 記錄ID,可選*keyword: string   *// 搜索關鍵詞*timestamp?: string  *// 搜索時間戳,可選*}
  • adcode的數據字典:
/***** 城市編碼模型*** 用于存儲城市相關的編碼信息***/*export interface adcode {id: number      *// 城市ID*pid?: number     *// 父級ID,可選*city_code: string  *// 城市編碼*city_name: string  *// 城市名稱*post_code?: string  *// 郵政編碼,可選*area_code?: string  *// 區號,可選*ctime?: string    *// 創建時間,可選*}

這兩個模型的主要用途:

SearchHistoryItem:

  • 用于記錄用戶的搜索歷史

  • 包含搜索關鍵詞和時間信息

  • 可用于實現搜索歷史功能

adcode:

  • 用于存儲城市信息

  • 包含城市編碼、名稱等基本信息

  • 支持城市層級關系(通過pid)

  • 包含郵政和區號等附加信息

創建數據庫表格

編寫DbUtils實現對于表格的創建。

  • 創建名為 weatherinfo.db 的數據庫

  • 設置數據庫安全級別為 S1

  • 初始化兩個數據表:

  • t_adcode:存儲城市信息

  • t_search:存儲搜索歷史

import { relationalStore } from "@kit.ArkData";/***作者:gxx*時間:2025/4/21 9:16*功能:數據庫操作**/
// 城市編碼表名
export const TABLENAME: string = 't_adcode'// 搜索歷史表名
export const TABLENAME1: string = 't_search'// 數據庫配置
const CONFIG: relationalStore.StoreConfig = {name: 'weatherinfo.db', // 數據庫名稱securityLevel: relationalStore.SecurityLevel.S1 // 安全級別
}/*** 獲取數據庫實例* @param context 上下文對象* @returns 數據庫實例*/
export async function getrdb(context: Context) {return relationalStore.getRdbStore(context, CONFIG)
}/*** 創建數據庫表* @param context 上下文對象* @description 創建城市編碼表和搜索歷史表*/
export async function createtable(context: Context) {try {// 創建城市編碼表SQL語句let sql = 'CREATE TABLE IF NOT EXISTS t_adcode (\n' +'    id INTEGER PRIMARY KEY AUTOINCREMENT,\n' + // 自增主鍵'name TEXT NOT NULL,    code VARCHAR(50) NOT NULL,\n' + // 城市名稱和編碼'    city VARCHAR(50) \n' + // 所屬城市');'// 創建搜索歷史表SQL語句let sql1 = 'CREATE TABLE IF NOT EXISTS t_search (\n' +'  id INTEGER PRIMARY KEY AUTOINCREMENT,\n' + // 自增主鍵'keyword TEXT NOT NULL,    timestamp VARCHAR(50) NOT NULL);' // 搜索關鍵詞和時間戳// 獲取數據庫實例并執行SQLlet rdb = await getrdb(context)rdb.executeSync(sql)rdb.executeSync(sql1)} catch (e) {console.error('dbutils 創建表格失敗: ', JSON.stringify(e))}
}

在EntryAbility中創建表格。

import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { createtable } from '../utils/Dbutils';const DOMAIN = 0x0000;export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');}onDestroy(): void {hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');}async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {// 1. 記錄窗口創建日志hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');// 2. 創建數據庫表格// 創建adcode和search_history兩個表格用于存儲城市代碼和搜索歷史await createtable(this.context)// 3. 加載啟動頁面// 加載splash頁面,splash頁面會檢查是否已導入城市數據// 如果未導入則會從cityma.txt讀取并導入數據庫// 導入完成后跳轉到主頁面IndexwindowStage.loadContent('pages/splash', async (err) => {if (err.code) {// 4. 加載失敗處理hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));return;}// 5. 加載成功記錄hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');});}onWindowStageDestroy(): void {// Main window is destroyed, release UI related resourceshilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');}onForeground(): void {// Ability has brought to foregroundhilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');}onBackground(): void {// Ability has back to backgroundhilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');}
}

Splash頁面

頁面功能

1.數據初始化:

  • 頁面啟動時會檢查是否已經加載過城市數據(通過 PreferenceUtils 存儲的 isload 標志)

  • 如果數據未加載,會執行 charu 函數來初始化數據

2.charu 函數的具體工作:

  • 從資源文件中讀取 cityma.txt(城市碼數據文件)

  • 將文件內容解析為 JSON 數據

  • 通過 adcodedao 將城市數據插入到數據庫中

  • 使用 @Concurrent 注解確保在后臺線程執行,避免阻塞主線程

3.界面展示:

  • 顯示一個啟動圖片

  • 展示一個環形進度條動畫

  • 顯示"加載中…"文字

4.頁面跳轉:

  • 數據加載完成后,會自動跳轉到主頁面(pages/Index)
歡迎頁代碼
import { adcodedao } from '../dao/adcodedao';
import { buffer, taskpool } from '@kit.ArkTS';
import { common } from '@kit.AbilityKit';
import { adcode } from '../model/adcode';
import { PreferenceUtils } from '../utils/PreferenceUtils';
import { router } from '@kit.ArkUI';/*** 插入城市數據到數據庫* @param context 上下文對象* @returns 插入是否成功*/
@Concurrent
async function charu(context: Context) {try {// 創建數據訪問對象let ad = new adcodedao(context)// 讀取原始文件內容let value = await context.resourceManager.getRawFileContent('cityma.txt')// 轉換為字符串let data = buffer.from(value).toString()// 解析JSON數據let content = JSON.parse(data) as adcode[]// 插入數據庫await ad.insert(content)return true} catch (e) {console.error('gxxt ', JSON.stringify(e))return false}
}// 持久化存儲的key名稱
const Prename: string = 'loaded'/*** 啟動頁面組件*/
@Entry
@Component
struct Splash {@State message: string = 'Hello World';// 進度條值@State value: number = 10// 上下文對象private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext// 定時器IDprivate intervalid: number = 0/*** 組件即將出現時的生命周期函數*/aboutToAppear(): void {// 設置定時器更新進度條this.intervalid = setInterval(() => {if (this.value == 100) {this.value = -10}this.value += 10}, 100)// 檢查是否已加載過數據let loaded = PreferenceUtils.getInstance(this.context, Prename).get('isload', false) as booleanif (loaded) {// 如果已加載過數據,直接跳轉到主頁router.replaceUrl({ url: 'pages/Index' })} else {// 如果未加載過數據,則讀取文件并插入數據庫taskpool.execute(charu, this.context).then((value) => {// 保存加載狀態PreferenceUtils.getInstance(this.context, Prename).putfile('isload', value as boolean)// 跳轉到主頁router.replaceUrl({ url: 'pages/Index' })})}}/*** 構建UI界面*/build() {Stack() {// 背景圖片Image($r('app.media.splash'))// 進度條Progress({ value: this.value, total: 100, type: ProgressType.ScaleRing }).width(100).height(100).backgroundColor(Color.Black).style({ strokeWidth: 15, scaleCount: 20, scaleWidth: 5 }).color(Color.White)// 加載提示文本Text('加載中...').fontWeight(FontWeight.Bolder)}.height('100%').width('100%').alignContent(Alignment.Center)}/*** 組件即將消失時的生命周期函數*/aboutToDisappear(): void {// 清除定時器clearInterval(this.intervalid)}
}
亮點

1.使用多線程將大量數據批量插入數據庫

批量插入:

 /*** 批量插入城市數據到數據庫* @param acs 城市數據數組* @description 將城市數據批量插入到數據庫中* 如果城市數據包含ctime字段,則插入name、code、city三個字段* 否則只插入name和code兩個字段*/async insert(acs: adcode[]) {try {// 獲取數據庫實例let rdb = await getrdb(this.context)// 存儲要插入的數據let values: relationalStore.ValuesBucket[] = []// 遍歷城市數據acs.forEach((ac: adcode) => {let value: relationalStore.ValuesBucket// 判斷是否有ctime字段if (ac.ctime) {value = {'name': ac.city_name, // 城市名稱'code': ac.city_code, // 城市編碼'city': ac.ctime // 所屬城市}} else {value = {'name': ac.city_name, // 城市名稱'code': ac.city_code, // 城市編碼}}values.push(value)})// 批量插入數據rdb.batchInsertSync(TABLENAME, values)} catch (e) {console.error('gxxt adcodedao 插入數據錯誤: ', e.message)}}

多線程運行實體:

@Concurrent
async function charu(context: Context) {try {// 創建數據訪問對象let ad = new adcodedao(context)// 讀取原始文件內容let value = await context.resourceManager.getRawFileContent('cityma.txt')// 轉換為字符串let data = buffer.from(value).toString()// 解析JSON數據let content = JSON.parse(data) as adcode[]// 插入數據庫await ad.insert(content)return true} catch (e) {console.error('gxxt ', JSON.stringify(e))return false}
}

多線程執行:

 // 如果未加載過數據,則讀取文件并插入數據庫taskpool.execute(charu, this.context).then((value) => {// 保存加載狀態PreferenceUtils.getInstance(this.context, Prename).putfile('isload', value as boolean)// 跳轉到主頁router.replaceUrl({ url: 'pages/Index' })})

2.使用Interval配合環形刻度進度條來制作動態的加載動畫

 // 設置定時器更新進度條this.intervalid = setInterval(() => {if (this.value == 100) {this.value = -10}this.value += 10}, 100)
....................................// 進度條Progress({ value: this.value, total: 100, type: ProgressType.ScaleRing }).width(100).height(100).backgroundColor(Color.Black).style({ strokeWidth: 15, scaleCount: 20, scaleWidth: 5 }).color(Color.White)

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

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

相關文章

使用譜聚類將相似度矩陣分為2類

使用譜聚類將相似度矩陣分為2類的步驟如下&#xff1a; 構建相似度矩陣&#xff1a;提供的1717矩陣已滿足對稱性且對角線為1。 計算度矩陣&#xff1a;對每一行求和得到各節點的度&#xff0c;形成對角矩陣。 計算歸一化拉普拉斯矩陣&#xff1a;采用對稱歸一化形式 LsymI?D…

MySQL 8.0 OCP 英文題庫解析(三)

Oracle 為慶祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免費考取原價245美元的MySQL OCP 認證。 從今天開始&#xff0c;將英文題庫免費公布出來&#xff0c;并進行解析&#xff0c;幫助大家在一個月之內輕松通過OCP認證。 本期公布試題16~25 試題16:…

【SQL】如何在 SQL 中統計結構化字符串的特征頻率

在數據分析場景中&#xff0c;我們經常會遇到需要解析結構化字符串并統計特征出現次數的需求。本文將以常用數據庫為例&#xff0c;探討如何高效處理類似 [特征A][特征B][特征C] 格式的字符串數據&#xff0c;并實現特征頻率統計。以下是完整的實現思路和解決方案。 一、問題場…

Docker Compose 的安裝方法

以下是 Docker Compose 的安裝方法整理&#xff0c;綜合了多篇指南的推薦步驟和注意事項&#xff1a; 一、安裝前準備 確保已安裝 Docker Docker Compose 依賴 Docker 引擎運行&#xff0c;需先安裝 Docker。若未安裝&#xff0c;可通過以下命令一鍵安裝&#xff08;國內服…

配置Nginx解決http host頭攻擊漏洞【詳細步驟】

前言 大概內容&#xff1a; 安全系統滲透測試出host頭攻擊漏洞&#xff0c;下面是解決步驟&#xff0c;本人已測過無問題。 server_name aaabbb.com; if ($http_Host !~* ^127.0.0.1|aaabbb.com|localhost$){return 403;}

自研時序大模型講解(4月29日)直播回顧

4 月 29 日&#xff0c;清華團隊揭秘&#xff1a;時序大模型如何讓數據“活”起來線上直播圓滿結束。清華大學軟件學院博士生&#xff0c;IoTDB 原生機器學習引擎 AINode 研發同學劉雍在線上面向數千人次的時序數據分析人員與 AI 大模型行業關注者&#xff0c;就時序大模型的發…

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作獲取第二維度,第三維度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作獲取第1 維度,第二維度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 這行代碼的作用是創建一個與 prompt_embedding[:, :, 0] 形狀相同且所有元素都為 1 的張量,它用于初始化…

鴻蒙Next API17新特性學習之如何使用新增鼠標軸事件

今天咱們接著學習鴻蒙開發文檔API17版本的新特性——對鼠標軸事件的支持。這對于需要精細交互的應用來說是一個非常有用的特性&#xff0c;例如地圖滾動、文檔瀏覽等場景。本文將詳細介紹在鴻蒙 Next 中如何使用新增的鼠標軸事件。 開發步驟 環境準備 在開始開發之前&#x…

【行為型之命令模式】游戲開發實戰——Unity可撤銷系統與高級輸入管理的架構秘鑰

文章目錄 ?? 命令模式&#xff08;Command Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;可撤銷的建造系統&#xff09;1. 定義命令接口與接收者2. 實現具體命令3. 命令管理器&#xff08;Invoker&#xff09;4. 客戶端使…

計算機網絡|| 路由器和交換機的配置

一、實驗目的 1. 了解路由器和交換機的工作模式和使用方法&#xff1b; 2. 熟悉 Cisco 網絡設備的基本配置命令&#xff1b; 3. 掌握 Cisco 路由器的基本配置方式及配置命令&#xff1b; 4. 掌握路由器和交換機的基本配置與管理方法。 二、實驗環境 1. 運行 Windows 操作…

面試--HTML

1.src和href的區別 總結來說&#xff1a; <font style"color:rgb(238, 39, 70);background-color:rgb(249, 241, 219);">src</font>用于替換當前元素&#xff0c;指向的資源會嵌入到文檔中&#xff0c;例如腳本、圖像、框架等。<font style"co…

CVPR2025 | Prompt-CAM: 讓視覺 Transformer 可解釋以進行細粒度分析

Prompt-CAM: Making Vision Transformers Interpretable for Fine-Grained Analysis 摘要-Abstract引言-Introduction方法-Approach預備知識-PreliminariesPrompt-CAM: Prompt Class Attention Map特征識別與定位-Trait Identification and Localization變體與擴展-Variants an…

動態規劃問題 -- 多狀態模型(粉刷房子)

目錄 動態規劃分析問題五步曲題目概述代碼編寫 動態規劃分析問題五步曲 不清楚動態規劃分析問題是哪關鍵的五步的少年們可以移步到 鏈接: 動態規劃算法基礎 這篇文章非常詳細的介紹了動態規劃算法是如何分析和解決問題的 題目概述 鏈接: 粉刷房子 狀態表示&#xff08;題目要求…

Spring Boot 注解詳細解析:解鎖高效開發的密鑰

一、引言 Spring Boot 以其快速開發、自動配置等特性&#xff0c;成為構建 Java 應用程序的熱門框架。而注解在 Spring Boot 中扮演著至關重要的角色&#xff0c;它們如同魔法指令&#xff0c;簡化了配置流程&#xff0c;增強了代碼的可讀性與可維護性。本文將深入剖析 Spring…

【Python】抽象基類ABC

抽象基類(Abstract Base Classes)的核心作用 抽象基類(ABC)是Python中一種特殊的類&#xff0c;它通過abc模塊實現&#xff0c;主要服務于面向對象編程中的接口規范和設計約束。以下是它的核心作用&#xff1a; 1. 強制接口實現&#xff08;核心作用&#xff09; 確保子類必…

[python] Python單例模式:__new__與線程安全解析

一 實例的創建過程 我們之前了解過在構造一個類的實例化對象時,會默認調用__init__方法&#xff0c;也就是類的初始化也叫構造函數&#xff0c;但其實在調用__init__方法前會首先調用__new__方法&#xff08;只有在py3新式類才有&#xff09;。即下面 __new__(): 創建實例 作…

筆記本電腦打開網頁很慢,一查ip地址網段不對怎么處理

我有一個筆記本&#xff0c;在家里連WIFI后獲取到的ip地址網段不對&#xff0c;那么常規做法是手動去配置個靜態IP和DNS&#xff0c;要知道筆記本IP地址默認采用的是DHCP&#xff0c;也就是動態獲取ip地址。如果手動設置靜態IP&#xff0c;也就是固定IP的話&#xff0c;你換個場…

怎樣將MM模塊常用報表設置為ALV默認格式(MB52、MB5B、ME2M、ME1M等)

【SAP系統研究】 對SAP系統中的報表,最方便的格式就是ALV了,可排序、可導出,非常友好。 但有些常見報表卻不是默認ALV界面的,譬如MB52: 是不是有點別扭?但其實是可以后臺配置進行調整的。 現將一些常用報表修改為默認ALV的方法進行總結,便于大家使用。 一、MB52、MB5…

Redis——達人探店

達人探店 發布探店筆記 探店筆記類似點評網站的評價&#xff0c;往往是圖文結合&#xff0c;對應的表有兩個&#xff1a; 發布博文對應兩個接口 案例&#xff1a;實現查看發布探店筆記的接口 需求&#xff1a;點擊首頁的探店筆記&#xff0c;會進入詳情頁面&#xff0c;實現…

Git初始化相關配置

Git配置 在Git安裝完成后&#xff0c;windows操作系統上會多出一個Git Bash的軟件&#xff0c;如果是linux或者是macOS&#xff0c;那么直接打開終端&#xff0c;在終端中敲擊命令即可 # 檢查git版本 git -v # 或 git --version在使用git時&#xff0c;需要配置一下用戶名和郵…