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

网友投稿 400 2023-05-11

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

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

https://harmonyos.51cto.com/#zz

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

错误: 类重复: 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.1首先将一个已经存在的sqlite文件放入指定位置

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

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

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

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

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

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

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

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

然后读取resoruce写入dbPath

复制FileOutputStream fos = new FileOutputStream(dbPath);  byte[] buffer = new byte[4096];  intcount = 0;  while((count = resource.read(buffer)) >= 0){  fos.write(buffer,0,count);  }​  1.2.3.4.5.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的全局变量

复制private RdbStore store;​  1.

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

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

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

复制private static final RdbOpenCallback callback = new RdbOpenCallback() {  @Override  public void onCreate(RdbStore rdbStore) {  @Override  public void onUpgrade(RdbStore rdbStore, int i, int i1) {  };​  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

 2.2 打开RdbStore

首先得new一个 DatabaseHelper

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

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

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

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

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

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

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

复制while(resultSet.goToNextRow()){  sqliteData sqldata = new sqliteData();  sqldata.no = resultSet.getInt(0);  sqldata.clubName = resultSet.getString(1);  result.add(sqldata);  }​  1.2.3.4.5.6.7.8.9.10.11.

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

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

复制package com.harmony.rdbstoreexample;  import ohos.app.AbilityContext;  import ohos.data.DatabaseHelper;  import ohos.data.rdb.RdbOpenCallback;  import ohos.data.rdb.RdbStore;  import ohos.data.rdb.StoreConfig;  import ohos.data.resultset.ResultSet;  import ohos.global.resource.Resource;  import java.io.File;  import java.io.FileOutputStream;  import java.io.IOException;  import java.nio.file.Paths;  import java.util.ArrayList;  public class readSqliteFile {  private AbilityContext context;  private File dirPath;  private File dbPath;  private RdbStore store;  private StoreConfig config = StoreConfig.newDefaultConfig("PremierLeague.sqlite");  private static final RdbOpenCallback callback = new RdbOpenCallback() {  @Override  public void onCreate(RdbStore rdbStore) {  @Override  public void onUpgrade(RdbStore rdbStore, int i, int i1) {  };  public readSqliteFile(AbilityContext context)  this.context = context;  dirPath = new File(context.getDataDir().toString() + "/MainAbility/databases/db");  if(!dirPath.exists()){  dirPath.mkdirs();  dbPath = new File(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString());  private void extractDB() throws IOException{  Resource resource = context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile();  if(dbPath.exists()){  dbPath.delete();  FileOutputStream fos = new FileOutputStream(dbPath);  byte[] buffer = new byte[4096];  intcount = 0;  while((count = resource.read(buffer)) >= 0){  fos.write(buffer,0,count);  resource.close();  fos.close();  public void init() throws IOException{  extractDB();  DatabaseHelper helper = new DatabaseHelper(context);  store = helper.getRdbStore(config,1,callback,null);  public ArrayList search(){  ResultSet resultSet = store.querySql("select * from team",null);  ArrayList result = new ArrayList();  while(resultSet.goToNextRow()){  sqliteData sqldata = new sqliteData();  sqldata.no = resultSet.getInt(0);  sqldata.clubName = resultSet.getString(1);  result.add(sqldata);  resultSet.close();  return result;  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.

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

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

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

https://harmonyos.51cto.com/#zz

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:API治理:有效API管理的优秀实践和策略
下一篇:API Star:一个Python 3的API框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~