文章开始前先分享一个报错:
错误: 类重复: 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。
- dirPath = new File(context.getDataDir().toString() + "/MainAbility/databases/db");
- dbPath = new File(Paths.get(dirPath.toString(),"PremierLeague.sqlite").toString());
然后通过下面一行打开刚才我们放入的sqlite文件:resource
- Resource resource = context.getResourceManager().getRawFileEntry("resources/rawfile/PremierLeague.sqlite").openRawFile();
然后读取resoruce写入dbPath
- FileOutputStream fos = new FileOutputStream(dbPath);
- byte[] buffer = new byte[4096];
- int count = 0;
- while((count = resource.read(buffer)) >= 0){
- fos.write(buffer,0,count);
- }
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;
定义需要的StoreConfig配置文件,可以看到配置文件中指定的数据库的名字,这里是指的刚才写入的dbPath中的。
- 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) {
-
- }
-
- };
2.2 打开RdbStore
首先得new一个 DatabaseHelper
- DatabaseHelper helper = new DatabaseHelper(context);
然后从new出的DatabaseHelper调用getRdbStore获得RdbStore对象
- store = helper.getRdbStore(config,1,callback,null);
2.3 从上一步打开的RdbStore中进行查询
首先使用querySql传入sql语句进行查询
- ResultSet resultSet = store.querySql("select * from team",null);
然后使用ResultSet类的goToNextRow()进行读取
- while(resultSet.goToNextRow()){
-
- sqliteData sqldata = new sqliteData();
-
- sqldata.no = resultSet.getInt(0);
-
- sqldata.clubName = resultSet.getString(1);
-
- result.add(sqldata);
-
- }
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];
-
- int count = 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;
-
- }
-
- }
©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任