HarmonyOS应用开发基础 课件 项目 7 数据存储_第1页
HarmonyOS应用开发基础 课件 项目 7 数据存储_第2页
HarmonyOS应用开发基础 课件 项目 7 数据存储_第3页
HarmonyOS应用开发基础 课件 项目 7 数据存储_第4页
HarmonyOS应用开发基础 课件 项目 7 数据存储_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目7:数据存储在HarmonyOS应用开发中,数据持久化是保障用户体验与功能完整性的核心技术。本项目从文件存储基础出发,逐步深入应用数据管理的高效方案。通过文件基础服务(CoreFileKit)实现本地数据读写,掌握沙箱隔离与安全共享机制;结合ArkData(方舟数据管理)服务,学习用户首选项、关系型数据库等结构化存储技术,理解多场景下的数据同步与跨设备协作能力。导学目标知识目标掌握HarmonyOS文件存储核心机制,包括沙箱隔离、文件分类模型理解ArkData服务架构及其组件的适用场景熟悉CoreFileKit读写接口与ArkData标准化数据管理流程掌握用户首选项(Preferences)轻量级配置与关系型数据库增删改查操作能力目标能使用文件基础服务API实现本地数据读写与安全存储能基于用户首选项管理轻量级配置数据,并实现数据变更监听能设计并实现关系型数据库表结构,完成复杂数据的增删改查及事务管理能根据业务需求选择文件存储或数据库方案,完成数据迁移与性能优化素质目标培养独立分析问题、解决问题的能力,养成科学严谨的学习工作态度培养对数据安全与隐私保护的敏感意识,规范使用沙箱机制与加密策略任务1文件存储复杂应用不可避免地需要在本地存储一些必要数据,如设置信息、运行日志、帐号密码等,这些数据在应用退出后依然可以在设备上留存,以便后续使用。本任务将创建一个简易的登录界面,在完成UI设计的基础上,实现帐号注册和登录比对功能。ArkUI无法直接提供数据存储功能,这就需要HarmonyOS提供的文件基础服务来实现。7.1文件基础服务概述CoreFileKit(文件基础服务)为开发者提供一套访问和管理应用文件和用户文件的能力,帮助用户更高效地管理、查找和备份各类文件。按文件所有者不同,文件分为三大类:应用文件文件所有者为应用,包括应用安装文件、应用资源文件、应用缓存文件等。每个应用拥有独立的资源文件与缓存文件目录。用户文件文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等,分为内置存储与外置存储。系统文件与应用和用户无关的其他文件,包括公共库、设备文件、系统资源文件、配置文件等。不需要开发者进行文件管理。文件分类模型示意图图7-1展示了HarmonyOS文件分类模型。应用文件按用户(用户A/用户B)隔离,每个用户下各应用拥有独立的资源文件与缓存文件;用户文件存储在内置/外置存储中;系统文件位于最底层,由操作系统统一管理。7.1.2CoreFileKit使用场景与特性主要使用场景应用文件访问和文件分享应用数据备份恢复选择与保存用户文件跨设备的文件访问和分享能力两大核心特性①沙箱隔离:对于每个应用,系统会在内部存储空间映射出一个专属的"应用沙箱目录",它是"应用文件目录"与一部分系统文件所在目录组成的集合,避免数据受到恶意路径穿越访问。②应用分享:应用之间可以通过分享URI(UniformResourceIdentifier)或文件描述符FD(FileDescriptor)的方式进行文件共享,实现跨应用数据交互。7.2应用文件持久化应用文件指文件所有者为应用,包括应用安装文件、应用资源文件、应用缓存文件等。应用文件有如下核心特点:应用专属目录设备上应用所使用及存储的数据,以文件、键值对、数据库等形式保存在一个应用专属的目录内,称为应用文件目录。应用沙箱目录应用文件目录与一部分系统文件(应用运行必须使用的系统文件)所在的目录组成了一个集合,称为应用沙箱目录,代表应用可见的所有目录范围。只读系统文件系统文件及其目录对于应用是只读的。应用仅能保存文件到应用文件目录下,根据目录的使用规范和注意事项来选择将数据保存到不同的子目录中。7.2.1应用沙箱概述应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为应用沙箱目录。图7-2展示了应用沙箱文件访问关系:应用进程可直接访问应用沙箱目录(含应用文件和少量系统文件),也可通过用户授权访问外部的用户文件,但无法直接访问外部系统文件。应用沙箱目录与沙箱路径图7-3展示了路径隔离过程:从系统进程视角经权限隔离到服务进程视角,再经挂载隔离到系统应用视角,最终到普通应用视角,可见文件和目录逐步减少。普通应用视角下看到的路径称为应用沙箱路径,与实际物理路径并非1:1映射关系,沙箱路径总是少于系统进程视角可见的物理路径。应用文件目录结构图7-4展示了应用文件目录的七级结构:一级

data/(应用文件根目录)→二级

storage/(持久化文件目录)→三级

el1/~el4/(文件加密类型,加密等级越高越严格,一般应将数据存放在el2加密目录下)→四/五级通过ApplicationContext获取files、cache、preferences、temp等目录路径→六/七级HAP级别应用文件路径(随HAP卸载而删除)。应用文件路径说明(表7-1)目录名Context属性名类型说明bundlebundleCodeDir安装文件路径应用安装后HAP资源包所在目录;随应用卸载而清理。不能拼接路径访问资源文件,需使用资源管理接口。baseNA本设备文件路径应用在本设备上存放持久化数据的目录,子目录包含files/、cache/、temp/和haps/;随应用卸载而清理。databasedatabaseDir数据库路径应用在el2加密条件下存放通过分布式数据库服务操作的文件目录;仅用于保存私有数据库数据。distributedfilesdistributedFilesDir分布式文件路径应用在el2加密条件下存放分布式文件的目录,可分布式跨设备直接访问;适合多设备共享/备份/协助文件。filesfilesDir应用通用文件路径通用的存放默认长期保存的文件路径;可保存用户持久性文件、图片、媒体文件及日志文件等。cachecacheDir应用缓存文件路径用于缓存下载的文件或可重新生成的缓存文件;超过配额或系统空间不足时自动清理,不要存储重要数据。preferencespreferencesDir应用首选项文件路径通过数据库API存储配置类或首选项的目录;仅适用于存储少量数据。temptempDir应用临时文件路径仅在应用运行期间产生和需要的文件,应用退出后即清理;适合存储数据库缓存、临时日志、下载安装包等。沙箱路径与物理路径对应关系(表7-2)应用沙箱路径物理路径/data/storage/el1/bundle应用安装包目录:/data/app/el1/bundle/public//data/storage/el1/base应用el1级别加密数据目录:非独立沙箱运行的应用:/data/app/el1/<USERID>/base/<PACKAGENAME>;以独立沙箱运行的Extension应用:/data/app/el1/<USERID>/base/+extension-<EXTENSIONPATH>+<PACKAGENAME>/data/storage/el2/base应用el2级别加密数据目录:非独立沙箱:/data/app/el2/<USERID>/base/<PACKAGENAME>;独立沙箱Extension:/data/app/el2/<USERID>/base/+extension-+<PACKAGENAME>/data/storage/el1/database应用el1级别加密数据库目录:非独立沙箱:/data/app/el1/<USERID>/database/<PACKAGENAME>;独立沙箱Extension:/data/app/el1/<USERID>/database/+extension-+<PACKAGENAME>/data/storage/el2/database应用el2级别加密数据库目录:非独立沙箱:/data/app/el2/<USERID>/database/<PACKAGENAME>;独立沙箱Extension:/data/app/el2/<USERID>/database/+extension-+<PACKAGENAME>/data/storage/el2/distributedfiles/mnt/hmdfs/<USERID>/account/merge_view/data/<PACKAGENAME>7.2.2应用文件访问接口(表7-3)开发者通过基础文件操作接口(ohos.file.fs)实现应用文件访问能力。支持同步的接口在命名上需额外加上Sync,例如同步打开文件为openSync,同步读取文件为readSync。接口名功能接口类型同步异步access检查文件是否存在方法√√close关闭文件方法√√copyFile复制文件方法√√listFile列出文件夹下所有文件名方法√√mkdir创建目录方法√√open打开文件方法√√read从文件读取数据方法√√write将数据写入文件方法√√unlink删除单个文件方法√√stat获取文件详细属性信息方法√√rename重命名文件或文件夹方法√√File.fd获取文件描述符属性--OpenMode设置文件打开标签属性--应用文件访问步骤:导入模块与获取路径01导入模块导入文件基础服务对象fileIo,并重命名为fs,后续通过fs.接口名()完成调用。import{fileIoasfs}from'@kit.CoreFileKit';02获取应用沙箱路径对文件/目录进行操作前,需先获取其应用沙箱路径。在UIAbility内通过this.context获取上下文,或通过getContext(this)获取:letcontext=getContext(this)ascommon.UIAbilityContext;letfilesDir=context.filesDir;03新建/打开文件使用openSync接口打开或新建文件。第一个参数为沙箱路径,第二个可选参数mode为打开选项(READ_ONLY/WRITE_ONLY/READ_WRITE),可通过"|"叠加额外选项(CREATE/TRUNC/APPEND等)。letfile=fs.openSync(filesDir+'/'+fileName,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);应用文件访问步骤:读写与关闭01写数据到文件(writeSync)第一个参数为文件描述符,第二个参数为待写入数据(ArrayBuffer或string),第三个可选参数支持offset(写入位置)、length(写入长度)、encoding(编码方式,默认utf-8)。返回值为实际写入的字节长度。letdata='writethisstringtofile';fs.writeSync(file.fd,data);02从文件读数据(readSync)第一个参数为文件描述符,第二个参数为保存读取数据的缓冲区(ArrayBuffer),第三个可选参数支持offset(读取位置)、length(读取长度)。返回值为实际读取的字节长度。letarrayBuffer=newArrayBuffer(1024);letreadLen=fs.readSync(file.fd,arrayBuffer);letbufferRd:string=buffer.from(arrayBuffer,0,readLen);03关闭文件(closeSync)已打开的文件不再使用时,必须通过closeSync接口关闭该文件,以避免潜在的访问异常。关闭后file对象或文件描述符不再具备实际意义,不可再用于读写等操作。fs.closeSync(file.fd);任务实施任务1实施思路本任务创建一个简易登录界面,通过文件基础服务实现帐号注册与登录比对功能。UI设计设计登录页,包含帐号、密码、登录、注册按钮。注册功能使用writeSync将帐号和密码写入应用文件。登录功能用readSync读取文件并与输入信息比对。以EmptyAbility模板、SDK版本13、设备类型为Phone创建项目,将Project视图切换为Ohos视图,编辑入口组件所在页面entry/ets/pages/Index.ets完成功能。任务1过程代码:注册功能(文件7-1)步骤2:通过文件基础服务完成注册功能,涉及文件写入操作(Index_step2.ets):import{fileIoasfs}from'@kit.CoreFileKit';import{common}from'@kit.AbilityKit';letcontext=getContext(this)ascommon.UIAbilityContext;letfilesDir=context.filesDir;constFILE_NAME_ACCOUNT='account.txt';constFILE_NAME_PASSWORD='password.txt';writeFile(fileName:string,data:string){letfile=fs.openSync(filesDir+'/'+fileName,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);fs.truncateSync(file.fd,0);//更新数据前清空文件内容fs.writeSync(file.fd,data);fs.closeSync(file.fd);}registerAccount():void{if(this.account===null||this.password===null||this.account===''||this.password===''){AlertDialog.show({title:'提示',message:'请正确输入帐号和密码'});return;}this.writeFile(FILE_NAME_ACCOUNT,this.account);this.writeFile(FILE_NAME_PASSWORD,this.password);}任务1过程代码:登录功能(文件7-2)步骤3:通过文件基础服务实现登录功能,涉及文件读取(Index.ets):readFile(fileName:string):string{letarrayBuffer=newArrayBuffer(1024);letfile=fs.openSync(filesDir+'/'+fileName,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);letreadLen=fs.readSync(file.fd,arrayBuffer);letbufferRd=buffer.from(arrayBuffer,0,readLen);fs.closeSync(file.fd);returnbufferRd.toString();}checkAccount():void{if(this.account==null||this.password==null||this.account==''||this.password==''){AlertDialog.show({title:'提示',message:'请正确输入帐号和密码'});return;}letaccountRd=this.readFile(FILE_NAME_ACCOUNT);letpasswordRd=this.readFile(FILE_NAME_PASSWORD);if(accountRd===this.account&&passwordRd===this.password){AlertDialog.show({title:'登录成功',message:'欢迎登录:'+accountRd});}else{AlertDialog.show({title:'登录失败',message:'账号:'+accountRd+'密码:'+passwordRd});}}任务1运行结果图7-5:用户注册帐号时,可在对应的应用文件目录写入帐号和密码文件,文件可通过IDE的DeviceFileBrowser进行查看。图7-6:帐号注册后,输入正确帐号和密码,点击"登录"按钮后,可以正常完成帐号核对,弹出登录成功提示。拓展提升与思考感悟拓展提升本任务实现了登录界面的注册与登录功能,但只实现了一个帐号的存储。读者可以通过阅读文件基础服务接口,自行实现更为复杂的多帐号注册与登录匹配功能,进一步提升对CoreFileKit的掌握程度。思考感悟本项目通过实现登录功能,深入探讨了HarmonyOS文件存储的核心机制。文件基础服务(CoreFileKit)为应用数据持久化提供了安全高效的解决方案,其沙箱隔离机制为每个应用划定独立空间,保障数据互不侵犯。人与人之间也需要这样的边界感——尊重他人隐私,守住自己底线,社会才能和谐安宁。任务2应用数据持久化前一节任务中,在管理大量帐号的场景下,文件基础操作在查询、写入和管理方面效率较低。文件基础服务提供的文件操作可以完成数据的存储,但在数据管理效率、结构化数据管理的灵活性以及扩展性来说,都无法直接胜任要求。本任务将对上一节登录页面进行改良,采用应用数据持久化技术进行实现。针对应用数据持久化技术,HarmonyOS系统提供了方舟数据管理服务(ArkData)。7.3方舟数据管理(ArkData)简介ArkData(方舟数据管理)为开发者提供数据存储、数据管理和数据同步能力。例如,联系人应用数据可以保存到数据库中,ArkData提供数据库的安全、可靠及共享访问等管理机制,也支持与手表同步联系人信息。标准化数据定义提供HarmonyOS跨应用、跨设备的统一数据类型标准,包含标准化数据类型和标准化数据结构。数据存储提供通用数据持久化能力,根据数据特点,分为用户首选项、键值型数据库和关系型数据库三种形态。数据管理提供高效的数据管理能力,包括权限管理、数据备份恢复、数据共享框架等。数据同步提供跨设备数据同步能力,如分布式对象支持内存对象跨设备共享,分布式数据库支持跨设备数据库访问。应用创建的数据库都保存到应用沙箱,当应用卸载时,数据库也会自动删除。路径关键词为database。7.3.2ArkData运作机制架构图图7-7展示了ArkData三层架构:JSAPI层提供标准接口(Preferences、KV-Store、RelationalStore、DataObject、DataShare、UDMF);Frameworks&Systemservice层负责实现各部件数据存储与同步功能,底部由数据管理服务(DatamgrService)统一协调;OS层依赖sqlite3、文件系统、安全子系统等底层组件。ArkData各模块功能详解用户首选项(Preferences)提供轻量级配置数据的持久化能力,支持订阅数据变化通知。不支持分布式同步,常用于保存应用配置信息、用户偏好设置等。键值型数据管理(KV-Store)提供键值型数据库的读写、加密、手动备份及订阅通知能力。需要分布式能力时,KV-Store将同步请求发送给DatamgrService完成跨设备数据同步。关系型数据管理(RelationalStore)提供关系型数据库的增删改查、加密、手动备份及订阅通知能力。需要分布式能力时,RelationalStore将同步请求发送给DatamgrService完成跨设备数据同步。分布式数据对象(DataObject)独立提供对象型结构数据的分布式能力。应用需要重启后仍获取之前的对象数据时,使用DatamgrService的对象持久化能力做暂时保存。跨应用数据管理(DataShare)提供数据提供者provider、数据消费者consumer以及同设备跨应用数据交互的增删改查及订阅通知能力。不与任何数据库绑定,可对接关系型或键值型数据库。统一数据管理框架(UDMF)提供数据跨应用、跨设备交互标准,定义了跨应用、跨设备数据交互过程中的数据语言,提升数据交互效率。7.4应用数据持久化三种形态对比HarmonyOS标准系统支持三种典型的存储数据形态,开发者可根据业务需求选择合适的方案:7.4.1用户首选项(Preferences)场景介绍与运作机制用户首选项为应用提供Key-Value键值型数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。Preferences会将数据缓存在内存中,读取时能快速从内存获取,可通过flush接口将内存中的数据持久化至文件。适用场景:应用保存用户的个性化设置(字体大小、是否开启夜间模式等)。约束限制不保证进程并发安全,不支持多进程场景Key为string类型,非空且长度不超过1024字节Value为string类型时使用UTF-8编码,不为空时长度不超过16MB非UTF-8格式字符串请使用Uint8Array类型存储,否则会造成持久化文件格式错误调用removePreferencesFromCache()或deletePreferences()后,订阅的数据变更会主动取消,重新调用getPreferences()后需再次订阅建议存储数据不超过一万条,否则内存开销较大用户首选项运作机制图图7-8展示了用户首选项运作机制:用户程序通过ArkTS接口调用用户首选项读写对应的数据文件。每个文件唯一对应到一个Preferences实例,系统通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。应用首选项的持久化文件保存在应用沙箱内部,可以通过context获取其路径。用户首选项常用接口说明(表7-1)接口名称描述getPreferencesSync(context,options)获取Preferences实例。该接口存在异步版本。putSync(key,value)将数据写入Preferences实例,可通过flush将实例持久化。当对应键已存在时会覆盖其值。该接口存在异步版本。hasSync(key)检查Preferences实例是否包含名为给定Key的存储键值对。给定的Key值不能为空。该接口存在异步版本。getSync(key,defValue)获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue。该接口存在异步版本。deleteSync(key)从Preferences实例中删除名为给定Key的存储键值对。该接口存在异步版本。flush(callback)将当前Preferences实例的数据异步存储到用户首选项持久化文件中。on(type:'change',callback)订阅数据变更,订阅的数据发生变更后,在执行flush()方法后触发callback回调。off(type:'change',callback?)取消订阅数据变更。deletePreferences(context,options,callback)从内存中移除指定的Preferences实例。若有对应的持久化文件,则同时删除其持久化文件。用户首选项开发步骤01①导入模块import{preferences}from'@kit.ArkData';02②获取Preferences实例letdataPreferences:preferences.Preferences|null=null;letoptions:preferences.Options={name:'myStore'};dataPreferences=preferences.getPreferencesSync(context,options);03③写入数据(putSync)if(dataPreferences.hasSync('startup')){('Thekeystartupiscontained.');}else{dataPreferences.putSync('startup','auto');//特殊字符需转为Uint8Array存储letuInt8Array1=newutil.TextEncoder().encodeInto("~!@#%&.*()——+?");dataPreferences.putSync('uInt8',uInt8Array1);}04④读取数据(getSync)letval=dataPreferences.getSync('startup','default');//获取Uint8Array类型时需转换为字符串letuInt8Array2=dataPreferences.getSync('uInt8',newUint8Array(0));lettextDecoder=util.TextDecoder.create('utf-8');val=textDecoder.decodeToString(uInt8Array2asUint8Array);05⑤删除数据/持久化/订阅变更/删除文件删除键值对:dataPreferences.deleteSync('startup');数据持久化:调用flush()将缓存写入文件;订阅变更:调用on()传入回调方法;删除指定文件:调用deletePreferences()从内存移除实例并删除持久化文件。7.4.2关系型数据库(RelationalStore)概述与运作机制关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,例如班级学生信息(姓名、学号、各科成绩)或公司雇员信息(姓名、工号、职位)。图7-9:应用通过关系型数据库框架(kits+Framework)访问底层SQLite组件,支持事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。约束限制系统默认日志方式为WAL(WriteAheadLog)模式,默认落盘方式为FULL模式数据库中有4个读连接和1个写连接;无空闲读连接时,写连接可作为读连接使用同一时间只能支持一个写操作,以保证数据准确性应用卸载后,相关数据库文件及临时文件会被自动清除ArkTS支持的基本数据类型:number、string、二进制类型数据、boolean建议一条数据不超过2MB,超出则插入成功但读取失败关系型数据库操作主要接口(表7-2)接口名描述getRdbStore(context,config,callback)获得一个RdbStore,操作关系型数据库。用户可根据需求配置RdbStore的参数,然后通过RdbStore调用相关接口执行数据操作。executeSql(sql,bindArgs,callback)执行包含指定参数但不返回值的SQL语句,常用于建表、建库等DDL操作。insert(table,values,callback)向目标表中插入一行数据。操作成功返回行ID,否则返回-1。update(values,predicates,callback)根据predicates的指定实例对象更新数据库中的数据,返回受影响的行数。delete(predicates,callback)根据predicates的指定实例对象从数据库中删除数据,返回受影响的行数。query(predicates,columns,callback)根据指定条件查询数据库中的数据,返回ResultSet结果集对象。columns为空则查询所有列。deleteRdbStore(context,name,callback)删除数据库及数据库相关文件。关系型数据库开发步骤:导入与获取RdbStore01①导入模块import{relationalStore}from'@kit.ArkData';02②获取RdbStore(建库建表)配置参数包括数据库文件名name、安全级别securityLevel、是否加密encrypt、自定义路径customDir。数据库默认版本为0,通过判断版本防止重复建表:constSTORE_CONFIG:relationalStore.StoreConfig={name:'RdbTest.db',securityLevel:relationalStore.SecurityLevel.S3,encrypt:false,customDir:'customDir/subCustomDir',};constSQL_CREATE_TABLE='CREATETABLEIFNOTEXISTSEMPLOYEE'+'(IDINTEGERPRIMARYKEYAUTOINCREMENT,'+'NAMETEXTNOTNULL,AGEINTEGER,'+'SALARYREAL,CODESBLOB,IDENTITYUNLIMITEDINT)';rdb=awaitrelationalStore.getRdbStore(context,STORE_CONFIG);if(rdb.version===0){rdb.executeSql(SQL_CREATE_TABLE);rdb.version=1;}关系型数据库开发步骤:插入与修改数据插入数据:调用insert()接口,第一个参数为目标表名,第二个参数为ValuesBucket键值对,第三个参数为callback回调(成功返回行ID,否则返回-1):constvalueBucket:relationalStore.ValuesBucket={'NAME':'Lisa','AGE':18,'SALARY':100.5,'CODES':newUint8Array([1,2,3,4,5]),'IDENTITY':BigInt('15822401018187971961171'),};rdb.insert('EMPLOYEE',valueBucket,(err,rowId)=>{if(err){return;}//插入成功,rowId为新行ID});修改数据:调用update(),通过RdbPredicates指定更新条件;删除数据:调用delete(),同样通过RdbPredicates指定删除条件:letpredicates=newrelationalStore.RdbPredicates('EMPLOYEE');predicates.equalTo('NAME','Lisa');rdb.update(valueBucket4,predicates,(err,rows)=>{...});predicates.equalTo('NAME','Lisa');rdb.delete(predicates,(err,rows)=>{(`Deleterows:${rows}`);});关系型数据库开发步骤:查询与删除数据库查询数据:调用query()方法,返回ResultSet结果集。ResultSet是一个数据集的游标,默认指向第1个记录,有效数据从0开始,使用完毕后需调用close()释放内存:letpredicates2=newrelationalStore.RdbPredicates('EMPLOYEE');predicates2.equalTo('NAME','Rose');rdb.query(predicates2,['ID','NAME','AGE','SALARY','IDENTITY'],(err,resultSet)=>{if(err){return;}while(resultSet.goToNextRow()){constid=resultSet.getLong(resultSet.getColumnIndex('ID'));constname=resultSet.getString(resultSet.getColumnIndex('NAME'));constage=resultSet.getLong(resultSet.getColumnIndex('AGE'));constsalary=resultSet.getDouble(resultSet.getColumnIndex('SALARY'));(`id=${id},name=${name},age=${age},salary=${salary}`);}resultSet.close();//释放数据集内存});删除数据库:调用deleteRdbStore()方法删除数据库及相关文件:rdb.deleteRdbStore(context,'RdbTest.db',(err)=>{if(err){return;}('SucceededindeletingRdbStore.');});任务实施任务2实施思路本任务对上一节登录页面进行改良,采用关系型数据库实现帐号注册与登录功能,支持多帐号存储。登录函数注册函数UI设计以EmptyAbility模板、SDK版本13、设备类型为Phone创建项目,将Project视图切换为Ohos视图,编辑entry/ets/pages/Index.ets完成功能。任务2过程代码:注册功能(文件7-3)步骤2:通过ArkData完成注册功能,涉及关系型数据库查询与写入(Index_step2.ets):constFILE_NAME_ACCOUNT='RdbAccount.db';constTABLE_NAME_ACCOUNT='EMPLOYEE';constCOLUMN_NAME_ACCOUNT='ACCOUNT';constCOLUMN_NAME_PASSWORD='PASSWORD';letrdb:relationalStore.RdbStore;asyncgetDb(){constSTORE_CONFIG:relationalStore.StoreConfig={name:FILE_NAME_ACCOUNT,securityLevel:relationalStore.SecurityLevel.S1,encrypt:false,};constSQL_CREATE_TABLE='CREATETABLEIFNOTEXISTS'+TABLE_NAME_ACCOUNT+'(IDINTEGERPRIMARYKEYAUTOINCREMENT,'+'ACCOUNTTEXTNOTNULL,PASSWORDTEXTNOTNULL)';rdb=awaitrelationalStore.getRdbStore(context,STORE_CONFIG);if(rdb.version===0){rdb.executeSql(SQL_CREATE_TABLE);rdb.version=1;}}registerAccount():void{//查询数据库,如果帐号存在则不做处理;否则插入数据库letpredicates=newrelationalStore.RdbPredicates(TABLE_NAME_ACCOUNT);predicates.equalTo(COLUMN_NAME_ACCOUNT,this.account);rdb.query(predicates,['ACCOUNT'],(err,resultSet)=>{if(err){return;}if(resultSet.rowCount>0){return;}//帐号已存在constvalue:relationalStore.ValuesBucket={ACCOUNT:this.account,PASSWORD:this.password};rdb.insert(TABLE_NAME_ACCOUNT,va

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论