当前位置:   article > 正文

鸿蒙开发两种简单本地数据库RDB和ORM的入门demo以及配置_鸿蒙 dataorm

鸿蒙 dataorm

DevEco studio 简单数据库

新手最近刚开始学鸿蒙开发,到数据库这里也查了挺多资料的,查完也挺恼火的,五六个内容基本完全相同的文章作者都加了自己原创然后一贴,细节也什么都不说,这里我今天搞懂了一些,希望对像我这样的初学者有一些帮助,少走一些弯路。

两种本地数据库创建方式

鸿蒙官网样例Demo(rdbdatabase 关系型数据库)

package com.example.rdbdatabase;

import com.example.rdbdatabase.slice.MainAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.data.DatabaseHelper;
import ohos.data.distributed.common.Query;
import ohos.data.rdb.*;
import ohos.data.resultset.ResultSet;

import javax.security.auth.callback.CallbackHandler;
import java.util.function.Predicate;

public class MainAbility extends Ability {
    RdbOpenCallback callback = new RdbOpenCallback() {
        @Override
        public void onCreate(RdbStore rdbStore) {
            rdbStore.executeSql("CREATE TABLE IF NOT EXISTS rdbdemo "+
            "(ID INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER NOT NULL)");
        }

        @Override
        public void onUpgrade(RdbStore rdbStore, int i, int i1) {

        }
    };
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        StoreConfig config = StoreConfig.newDefaultConfig("demo.db"); //配置数据库信息,该处采用默认。
        DatabaseHelper helper = new DatabaseHelper(this);   //我理解是一个生成操作数据库的对象,核心
        //通过helper对象找到数据库,若没有则创建,在创建数据库时回调 用于数据库中表的初始化
        RdbStore rdbStore = helper.getRdbStore(config, 1, callback, null);

        //插入数据
        this.rdb_insert(1,"zhang_san",20,rdbStore);
        this.rdb_insert(3,"li_si",27,rdbStore);
        this.rdb_insert(7,"wang_wu",33,rdbStore);

        //查询数据
        //两种方式,接口提供了使用原始的sql语句以及通过”谓词“的方式
        //原始sql语句
        System.out.println("下面通过原始sql语句的方式");
        ResultSet resultSet = rdbStore.querySql("select id,name from rdbdemo where age>? order by ID desc", new String[]{"25"});

        if(resultSet ==null)System.out.println("failed to query!");
        for(int i=0;i<resultSet.getRowCount();i++){
            resultSet.goToRow(i);
            System.out.println(" == ID = "+resultSet.getInt(resultSet.getColumnIndexForName("ID"))
                                +"name = "+resultSet.getString(resultSet.getColumnIndexForName("name"))+" == ");
        }

        //谓词的方式
        System.out.println("下面通过谓词的方式");
        RdbPredicates rdbPredicates = new RdbPredicates("rdbdemo").greaterThan("age", 25).orderByDesc("ID");
        String[] columns = new String[]{"ID","name"};
        ResultSet resultSet1 = rdbStore.query(rdbPredicates,columns);
        for(int i=0;i<resultSet1.getRowCount();i++){
            resultSet1.goToRow(i);
            System.out.println(" == ID = "+resultSet1.getInt(resultSet1.getColumnIndexForName("ID"))
                                +" name = "+resultSet1.getString(resultSet1.getColumnIndexForName("name"))+" == ");

        }


    }


    public long rdb_insert(int id,String name,int age,RdbStore rdbStore){
        ValuesBucket valuesBucket = new ValuesBucket();
        valuesBucket.putInteger("ID",id);
        valuesBucket.putString("name",name);
        valuesBucket.putInteger("age",age);
        return rdbStore.insert("rdbdemo",valuesBucket);

    }

    
}

  • 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

运行结果如下:
在这里插入图片描述

第二种数据库模板(ormdatabase对象关系映射数据库)

说句实话,昨天在CSDN上看到的几篇重复文章都是只讲的这里还有问题,所以我把我遇到的问题详细解决一下,供大家参考

这里用到了注解处理器。
这里不多赘述,直接上链接
java注解和注解处理器使用

鸿蒙开发工具也支持注解
但是需要提前配置,其他文章都是单纯告诉参数应该怎么写,并没有教配置,让新手很困惑,这里我给大家说一下

要在本模块(即entry)模块下的build,gradle配置文件中配置参数打开注解处理器
即下面这段参数
compileOptions{
annotationEnabled true
}
添加在如下位置

ohos {
    compileSdkVersion 6
    defaultConfig {
        compatibleSdkVersion 6
    }
    compileOptions{
        annotationEnabled true
    }


    buildTypes {
        release {
            proguardOpt {
                proguardEnabled false
                rulesFiles 'proguard-rules.pro'
            }
        }
    }
    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

随后这里许多文章没有提供。
为了可以识别注解还需要添加相关的架包的依赖
也是在该文档中

dependencies {
        compile files("ohos.jar的路径","orm_annotations_java.jar路径",
                "orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
        annotationProcessor files("orm_annotations_java.jar路径",
                "orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

将上面这段配置添加到下面的位置
其中路径需要自己替换一下
这些依赖都在DevEco安装目录下的SDK的java目录下的位置,可以通过搜索找到


ohos {
    compileSdkVersion 6
    defaultConfig {
        compatibleSdkVersion 6
    }
    compileOptions{
        annotationEnabled true
    }
    
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
    testImplementation 'junit:junit:4.13'
    ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200'

    compile files("ohos.jar的路径","orm_annotations_java.jar路径",
            "orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
    annotationProcessor files("orm_annotations_java.jar路径",
            "orm_annotations_processor_java.jar路径","javapoet_java.jar路径")
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

对象映射数据库的数据库和表的设计如下

//数据库
package com.example.ormdatabase.db;


import com.example.ormdatabase.db.table.User;
import ohos.data.orm.OrmDatabase;
import ohos.data.orm.annotation.Database;

@Database(entities = {User.class},version = 1)
public abstract class User_db extends OrmDatabase {
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

package com.example.ormdatabase.db.table;

import ohos.data.orm.OrmObject;
import ohos.data.orm.annotation.Entity;
import ohos.data.orm.annotation.Index;
import ohos.data.orm.annotation.PrimaryKey;

@Entity(tableName = "user") //这里也可以添加索引,这里我简单处理
public class User extends OrmObject {
    @PrimaryKey //将ID设置为主键
    private Integer ID;
    private String name;
    private Integer age;


    public Integer getID() {
        return ID;
    }

    public void setID(Integer ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

  • 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

开发者可通过创建一个继承了OrmObject并用@Entity注解的类,获取数据库实体对象,也就是表的对象。数据表必须与其所在的数据库在同一个模块中。
注解对照表

接口名称描述
@Database被@Database注解且继承了OrmDatabase的类对应数据库类。
@Entity被@Entity注解且继承了OrmObject的类对应数据表类
@Column被@Column注解的变量对应数据表的字段。
@PrimaryKey被@PrimaryKey注解的变量对应数据表的主键。
@ForeignKey被@ForeignKey注解的变量对应数据表的外键。
@Index被@Index注解的内容对应数据表索引的属性。
package com.example.ormdatabase.slice;

import com.example.ormdatabase.ResourceTable;
import com.example.ormdatabase.db.User_db;
import com.example.ormdatabase.db.table.User;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.data.DatabaseHelper;
import ohos.data.distributed.common.Query;
import ohos.data.orm.OrmContext;
import ohos.data.orm.OrmPredicates;

import java.util.List;
import java.util.function.Predicate;


public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        //ormContext为对象数据库的操作接口,之后的增删等操作都是通过该对象进行操作
        DatabaseHelper helper = new DatabaseHelper(this);

        OrmContext ormContext = helper.getOrmContext("User_db", "Userdemo.db", User_db.class);
        this.my_insert(1,"zhang_san",24,ormContext);
        this.my_insert(2,"li_si",27,ormContext);
        this.my_insert(3,"wang_wu",37,ormContext);
        OrmPredicates ormPredicates = ormContext.where(User.class).greaterThan("age", 25).orderByDesc("id");
        List<User> users = ormContext.query(ormPredicates);
        for(int i=0;i<users.size();i++){
            User user = users.get(i);
            System.out.println("== ID= "+user.getID()+" name= "+user.getName());
        }


    }
    public void my_insert(int ID,String name,int age,OrmContext ormContext){
        User user = new User();
        user.setID(ID);
        user.setName(name);
        user.setAge(age);
        ormContext.insert(user);   //插入内存
        ormContext.flush();         //持久化到数据库
    }


    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

  • 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

日志中的运行结果如下
在这里插入图片描述
组件那些我也会逐渐学精然后进行整理。
最近在学习dataability以及分布式数据库,过段时间也会写demo发布的。
如果内容有错的地方希望可以指正,谢谢。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/236847
推荐阅读
相关标签
  

闽ICP备14008679号