当前位置: 首页 > 科技观察

使用HarmonyOS官方关系型数据库API读取现有数据库_0

时间:2023-03-13 02:24:45 科技观察

更多信息请访问:与华为共建的Harmonyos技术社区https://harmonyos.51cto.com/#zz文章开始之前先分享一下报错:Error:Duplicateclass:com.harmony.onlineedict.ResourceTable现场出现这个错误:我把DEVECO升级到2.0Beta后,在升级前打开了一个项目,build的时候,出现了这个错误,一时之间也是一头雾水。迷茫中找到的解决方法是在Build中清理Project,然后继续build就OK了。正文开头:声明:本内容是在学习李宁老师课程的基础上编写的。你可以向李宁老师学习更多。这个老师很硬核!先放代码,https://gitee.com/forQinzhikai/harmony-osapplication.git中的RdbStoreExample文件夹就是demo的完整示例代码。有问题欢迎留言交流。先说一下要写的demo的大概逻辑。我直接提前存一个。将数据的sqlitedb文件放到demo文件夹下,然后使用HarmonyDeveloper提供的关系数据库的相关API读取之前放置的sqlite文件的内容,然后显示最终效果如下:关系数据库这个demo中操作数据库的一般逻辑。-1.将复制的sqlite文件读入应用程序-2.然后使用harmonyOS提供的API对读取的数据进行处理并显示1.将复制的sqlite文件夹读入应用程序1.1首先,一个存在的指定位置为/src/main/resources/rawfile,对,一定是这里,数据库文件内容如下:1.2然后读取上一步放的sqlite文件,读取里面输入这个应用程序可以识别的空格(理解暂时先到这里,反正只有这样,你才能看懂)具体的阅读过程,我创建了一个文件:readSqliteFile.java(见文末)这段代码还涉及到封装和打开的操作数据库并打开数据。本节只讲上一步读取复制文件的过程。首先,通过下面两行,指定读取数据的存放位置:dbPath。dirPath=newFile(context.getDataDir().toString()+"/MainAbility/databases/db");dbPath=newFile(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString());然后通过下面一行打开我们刚刚放入的sqlite文件:resourceResourceresource=context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile();然后读取resoruce写入dbPathFileOutputStreamfos=newFileOutputStream(dbPath);byte[]buffer=newbyte[4096];intcount=0;while((count=resource.read(buffer))>=0){fos.write(缓冲区,0,计数);}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全局变量privateRdbStoretore;定义需要的StoreConfig配置文件,可以看到配置文件中指定的数据库名称,就是指刚才写的dbPath。privateStoreConfigconfig=StoreConfig.newDefaultConfig("PremierLeague.sqlite");定义配置需要的回调函数,我们这里不需要,先空一个。privatestaticfinalRdbOpenCallbackcallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorerdbStore){}@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){}};2.2打开RdbStore,首先获取一个新的DatabaseHelperDatabaseHelperhelper=newDatabaseHelper(context);然后从新的调用getRdbStoreDatabaseHelper获取RdbStore对象store=helper.getRdbStore(config,1,callback,null);2.3从上一步打开的RdbStore中查询首先使用querySql传入sql语句查询ResultSetresultSet=store.querySql("select*fromteam",null);然后使用ResultSet类的goToNextRow()读取while(resultSet.goToNextRow()){sqliteDatasqldata=newsqliteData();sqldata.no=resultSet.getInt(0);sqldata.clubName=resultSet.getString(1);result.add(sqldata);}3.然后你得到数据库文件想要的数据就存放在ArrayList这里,然后就可以遍历到需要的地方了!packagecom.harmony.rdbstoreexample;importohos.app.AbilityContext;importohos.data.DatabaseHelper;importohos.data.rdb.RdbOpenCallback;importohos.data.rdb.RdbStore;importohos.data.rdb.StoreConfig;importohos.data.resultset.ResultSet;importohos.global.resource。资源;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.nio.file.Paths;importjava.util.ArrayList;publicclassreadSqliteFile{privateAbilityContextcontext;privateFiledirPath;privateFiledbPath;privateRdbStoretore;privateStoreConfigconfig=StoreConfig.newDefaultConfig("PremierLeague.sqlite");privatestaticfinalRdbOpenCallbackcallback=newRdbOpenCallback(){@OverridepublicvoidonCreate(RdbStorerdbStore){}@OverridepublicvoidonUpgrade(RdbStorerdbStore,inti,inti1){}};publicreadSqliteFile(AbilityContextcontext){this.context=context;dirPath=newFile(context.getDataDir().toString()+"/MainAbility/databases/db");if(!dirPath.exists()){dirPath.mkdirs();}dbPath=newFile(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString());}privatevoidextractDB()throwsIOException{Resourceresource=context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile();如果(dbPath.exists()){dbPath.delete();}FileOutputStreamfos=newFileOutputStream(dbPath);byte[]buffer=newbyte[4096];intcount=0;while((count=resource.read(buffer))>=0){fos.write(buffer,0,count);}resource.close();fos.close();}publicvoidinit()throwsIOException{extractDB();DatabaseHelperhelper=newDatabaseHelper(context);store=helper.getRdbStore(config,1,回调,null);}publicArrayListsearch(){ResultSetresultSet=store.querySql("select*fromteam",null);ArrayListresult=newArrayList();while(resultSet.goToNextRow()){sqliteDatasqldata=newsqliteData();sqldata.no=resultSet.getInt(0);sqldata.clubName=resultSet.getString(1);result.add(sqldata);}resultSet.close();returnresult;}}?版权归作者及鸿蒙技术社区所有,如需转载请注明出处,否则将追究法律责任。欲了解更多信息,请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz