文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

用鸿蒙HarmonyOS官方关系型数据库API去读取已存在的数据库

2024-12-03 14:05

关注

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/

文章开始前先分享一个报错:

错误: 类重复: com.harmony.onlineedict.ResourceTable

这个报错发生的现场是:我把DEVECO升级到2.0Beta后,我打开了一个在升级之前的项目,在构建的时候就发生了这个报错,一时让人很迷茫。

迷茫中找到的解决方式是在Build中Clean Project,然后继续构建就OK了。

正文开始:

申明一下:这个内容是学习了李宁老师课程的基础上写出来的,大家可以多多去和李宁老师学习哦,这个老师很硬核!

先把代码放上来,https://gitee.com/forQinzhikai/harmony-osapplication.git

其中的RdbStoreExample文件夹为该demo完整实例代码,大家有什么问题,欢迎留言交流

先说一下,要写的demo的大概逻辑,我会直接将一个事先已经存入一定数据的sqlite db文件放入demo文件夹中,然后使用Harmony Developer提供的关系型数据库的相关API去读取之前放入的sqlite文件的内容,然后展示出来

最后的效果如下:


该demo中操作关系型数据库的大概逻辑。

- 1.将拷贝过来的sqlite文件进行读入应用中

- 2.然后用harmonyOS提供的API去处理读入的数据并进行展示

1.将拷贝过来的sqlite文件夹读入应用

1首先将一个已经存在的sqlite文件放入指定位置

指定位置为/src/main/resources/rawfile,对,必须得这儿,数据库文件中的内容如下:

1.2 然后将读取上一步操作中放入的sqlite文件,将其读入本应用的所能识别的空间中(暂时先这么理解,反正只有这样做,你才能读取到)

具体的读取过程,我创建了一个文件:readSqliteFile.java(见文章最后)

这份代码中还涉及到了封装打开数据库和打开数据的操作,这一节只说一下读取上一步拷贝文件的过程。

首先通过下面两行,指定读取的数据要存入的位置:dbPath。

  1. dirPath = new File(context.getDataDir().toString() + "/MainAbility/databases/db"); 
  2. dbPath = new File(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString());​ 

 然后通过下面一行打开刚才我们放入的sqlite文件:resource

  1. Resource resource = context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile();​ 

然后读取resoruce写入dbPath

  1. FileOutputStream fos = new FileOutputStream(dbPath); 
  2. byte[] buffer = new byte[4096]; 
  3. int count = 0; 
  4. while((count = resource.read(buffer)) >= 0){ 
  5. fos.write(buffer,0,count); 
  6. }​ 

 2.然后用harmonyOS提供的API去处理读入的数据并进行展示

这一块的代码也在上一节展示的readSqliteFile.java文件中。在这里我们用到的是官方提供的数据管理模块中关系型数据库的API,链接:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-relational-overview-0000000000030046,这个API是RdbSotre系列。

2.1 配置RdbStore

定义一个RdbStore的全局变量

  1. private RdbStore store;​ 

定义需要的StoreConfig配置文件,可以看到配置文件中指定的数据库的名字,这里是指的刚才写入的dbPath中的。

  1. private StoreConfig config = StoreConfig.newDefaultConfig("PremierLeague.sqlite");​ 

定义配置需要的回调函数,这里我们还用不上,所以先用空的就行

  1. private static final RdbOpenCallback callback = new RdbOpenCallback() { 
  2.  
  3. @Override 
  4.  
  5. public void onCreate(RdbStore rdbStore) { 
  6.  
  7.  
  8. @Override 
  9.  
  10. public void onUpgrade(RdbStore rdbStore, int i, int i1) { 
  11.  
  12.  
  13. };​ 

 2.2 打开RdbStore

首先得new一个 DatabaseHelper

  1. DatabaseHelper helper = new DatabaseHelper(context);​ 

然后从new出的DatabaseHelper调用getRdbStore获得RdbStore对象

  1. store = helper.getRdbStore(config,1,callback,null);​ 

2.3 从上一步打开的RdbStore中进行查询

首先使用querySql传入sql语句进行查询

  1. ResultSet resultSet = store.querySql("select * from team",null);​ 

然后使用ResultSet类的goToNextRow()进行读取

  1. while(resultSet.goToNextRow()){ 
  2.  
  3. sqliteData sqldata = new sqliteData(); 
  4.  
  5. sqldata.no = resultSet.getInt(0); 
  6.  
  7. sqldata.clubName = resultSet.getString(1); 
  8.  
  9. result.add(sqldata); 
  10.  
  11. }​ 

 3.然后就得到了数据库文件想要的数据,这里将其存入了ArrayList,然后在需要的地方去遍历它就可以喽

下面附上readSqliteFile.java文件代码,整个demo从文章开头给出的gitee地址去下载就可以了!

  1. package com.harmony.rdbstoreexample; 
  2.  
  3. import ohos.app.AbilityContext; 
  4.  
  5. import ohos.data.DatabaseHelper; 
  6.  
  7. import ohos.data.rdb.RdbOpenCallback; 
  8.  
  9. import ohos.data.rdb.RdbStore; 
  10.  
  11. import ohos.data.rdb.StoreConfig; 
  12.  
  13. import ohos.data.resultset.ResultSet; 
  14.  
  15. import ohos.global.resource.Resource; 
  16.  
  17. import java.io.File; 
  18.  
  19. import java.io.FileOutputStream; 
  20.  
  21. import java.io.IOException; 
  22.  
  23. import java.nio.file.Paths; 
  24.  
  25. import java.util.ArrayList; 
  26.  
  27. public class readSqliteFile { 
  28.  
  29. private AbilityContext context; 
  30.  
  31. private File dirPath; 
  32.  
  33. private File dbPath; 
  34.  
  35. private RdbStore store; 
  36.  
  37. private StoreConfig config = StoreConfig.newDefaultConfig("PremierLeague.sqlite"); 
  38.  
  39. private static final RdbOpenCallback callback = new RdbOpenCallback() { 
  40.  
  41. @Override 
  42.  
  43. public void onCreate(RdbStore rdbStore) { 
  44.  
  45.  
  46. @Override 
  47.  
  48. public void onUpgrade(RdbStore rdbStore, int i, int i1) { 
  49.  
  50.  
  51. }; 
  52.  
  53. public readSqliteFile(AbilityContext context) 
  54.  
  55.  
  56. this.context = context; 
  57.  
  58. dirPath = new File(context.getDataDir().toString() + "/MainAbility/databases/db"); 
  59.  
  60. if(!dirPath.exists()){ 
  61.  
  62. dirPath.mkdirs(); 
  63.  
  64.  
  65. dbPath = new File(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString()); 
  66.  
  67.  
  68. private void extractDB() throws IOException{ 
  69.  
  70. Resource resource = context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile(); 
  71.  
  72. if(dbPath.exists()){ 
  73.  
  74. dbPath.delete(); 
  75.  
  76.  
  77. FileOutputStream fos = new FileOutputStream(dbPath); 
  78.  
  79. byte[] buffer = new byte[4096]; 
  80.  
  81. int count = 0; 
  82.  
  83. while((count = resource.read(buffer)) >= 0){ 
  84.  
  85. fos.write(buffer,0,count); 
  86.  
  87.  
  88. resource.close(); 
  89.  
  90. fos.close(); 
  91.  
  92.  
  93. public void init() throws IOException{ 
  94.  
  95. extractDB(); 
  96.  
  97. DatabaseHelper helper = new DatabaseHelper(context); 
  98.  
  99. store = helper.getRdbStore(config,1,callback,null); 
  100.  
  101.  
  102. public ArrayList search(){ 
  103.  
  104. ResultSet resultSet = store.querySql("select * from team",null); 
  105.  
  106. ArrayList result = new ArrayList(); 
  107.  
  108. while(resultSet.goToNextRow()){ 
  109.  
  110. sqliteData sqldata = new sqliteData(); 
  111.  
  112. sqldata.no = resultSet.getInt(0); 
  113.  
  114. sqldata.clubName = resultSet.getString(1); 
  115.  
  116. result.add(sqldata); 
  117.  
  118.  
  119. resultSet.close(); 
  120.  
  121. return result; 
  122.  
  123.  

 ©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯