HarmonyOS技术社区 · 2021年01月07日

#2020征文-手机#HarmonyOS对象关系映射数据库初体验

上一篇体验了关系型数据库,那一部分API允许我们自由的手写SQL。

这一篇的对象映射数据库是标准的ORM映射类似于Java中的hibernate框架,

将对象映射为表,更改对象就是更改表。

遇到问题

1 在删除和更改时手动创建一个对象传递过去,无法删除或者更改。

2 同一个对象多次添加会失败。

这一个图放上边,因为把注解开关放到了项目的gradle文件中导致我以为这个API不能用

实际上是放到模块的gradle文件中。

#2020征文-手机#HarmonyOS对象关系映射数据库初体验

这是一个数据库

package com.datang.myapplication.slice;

import ohos.data.orm.OrmDatabase;
import ohos.data.orm.annotation.Database;
import ohos.data.rdb.RdbOpenCallback;

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

    @Override
    public int getVersion() {
        return 0;
    }

    @Override
    public RdbOpenCallback getHelper() {
        return null;
    }
}

这是一个表

package com.datang.myapplication.slice;

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

@Entity(tableName = "user")
public class User  extends OrmObject {

    // 此处将userId设为了自增的主键。注意只有在数据类型为包装类型时,自增主键才能生效。
    @PrimaryKey(autoGenerate = true)
    private Integer userId;
    private String name;
    private int age;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

CRUD基本操作

package com.datang.myapplication.slice;

import com.datang.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.data.DatabaseHelper;
import ohos.data.orm.AllChangeToTarget;
import ohos.data.orm.OrmContext;
import ohos.data.orm.OrmObjectObserver;
import ohos.data.orm.OrmPredicates;
import ohos.data.rdb.*;
import ohos.data.resultset.ResultSet;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;

import java.util.List;

//关系型数据库
public class MainAbilitySlice2 extends AbilitySlice {

    HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MY_TAG");
    OrmContext context = null;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main2);
        initDB();

        insert();
        select();
        delete();
        update();

        //注册 user 表监听事件 insert update delete 会触发
        context.registerEntityObserver("user", (o, a) -> {
            HiLog.info(label, "触发回调了》》》》》》》》》》》》》》》》》》");
        });
    }


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

    public void initDB() {
        DatabaseHelper helper = new DatabaseHelper(this);
        context = helper.getOrmContext("DB1", "DB1.db", DB1.class);
    }

    //增加
    public void insert() {
        Button button = (Button) findComponentById(ResourceTable.Id_add);
        button.setClickedListener(e -> {

            for (int i = 1; i <= 10; i++) {
                //将这个对象添加进去,此外这里如果将User对象放到循环外,则会添加失败抛出异常
                //意味着不能对同一个对象做多次添加。就算属性都一样,也要创建多个。不知道是不是
                //bug
                User user = new User();
                user.setName("Zhang" + i);
                user.setAge(i);
                boolean isSuccessed = context.insert(user);
                //没有刷新添加不进去
                isSuccessed = context.flush();
                HiLog.info(label, "添加是否成功%{public}d,%{public}s", i, isSuccessed);
            }
        });


    }

    //查询
    public void select() {
        Button button2 = (Button) findComponentById(ResourceTable.Id_get);
        button2.setClickedListener(e -> {
            OrmPredicates query = context.where(User.class);
            List users = context.query(query);
            users.forEach(c -> {
                HiLog.info(label, "查询结果%{public}s", users);
            });
        });
    }

    //删除
    public void delete() {
        Button button3 = (Button) findComponentById(ResourceTable.Id_del);
        button3.setClickedListener(e -> {
            // 删除数据 User{userId=1, name='Zhang1', age=1}
            //直接创建一个 user对象,属性全部设置也不会删除
//            User user = new User();
//            user.setUserId(1);
//            user.setName("Zhang1");
//            user.setAge(1);

            //User{userId=1, name='Zhang1', age=1}
            //从数据库查出来的却可以用,实际上和上边那个创建出来的属性一样
            OrmPredicates predicates = context.where(User.class);
            predicates.equalTo("userId", 1);
            List users = context.query(predicates);
            User user = users.get(0);

            boolean delete = context.delete(user);
            //需要flush
            boolean flush = context.flush();
            HiLog.info(label, "是否删除%{public}s", flush);


            //这种删除方式就类似批量删除了,只给出删除条件,多少都删
            OrmPredicates predicates2 = context.where(User.class);
            predicates2.equalTo("name", "Zhang2");
            int delete2 = context.delete(predicates2);
            //并且不用flush
            //boolean flush = context.flush();
            HiLog.info(label, "是否删除%{public}d", delete2);
        });
    }


    //更改
    public void update() {
        Button button4 = (Button) findComponentById(ResourceTable.Id_upd);
        button4.setClickedListener(e -> {
            //同样手动创建的user也无法更改
//            User user = new User();
//            user.setUserId(1);
//            user.setName("李四特");
//            user.setAge(33);

            //查询出来
            OrmPredicates predicates = context.where(User.class);
            predicates.equalTo("userId", 1);
            List users = context.query(predicates);
            User user = users.get(0);
            user.setName("李四特");
            //更改
            boolean update = context.update(user);
            //需要flush
            boolean flush = context.flush();
            HiLog.info(label, "更改成功:%{public}s", update);

            //这种方式也是批量更改,更改后的值在 ValuesBucket中存储
            OrmPredicates predicates2 = context.where(User.class);
            predicates2.equalTo("userId", 2);
            ValuesBucket valuesBucket = new ValuesBucket();
            valuesBucket.putInteger("age", 31);
            valuesBucket.putString("name", "王二麻子");
            context.update(predicates2, valuesBucket);
            //不需要flush
            //boolean flush = context.flush();
            HiLog.info(label, "更改成功:%{public}s", update);
        });
    }

}

作者:顶风少年
想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/

推荐阅读
关注数
3010
内容数
446
华为鸿蒙相关技术,活动及资讯,欢迎关注及加入创作
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息