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

顶风少年
发布于 2021-1-6 22:16
浏览
1收藏

上一篇体验了关系型数据库,那一部分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<User> 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<User> 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<User> 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);
        });
    }

}

 

 

分类
已于2021-1-7 16:05:46修改
2
收藏 1
回复
举报
4条回复
按时间正序
/
按时间倒序
开发者训练营官方
开发者训练营官方

很棒的分享!!

回复
2021-1-7 18:01:12
顶风少年
顶风少年 回复了 开发者训练营官方
很棒的分享!!

谢谢关注!

回复
2021-1-7 21:10:15
zk0301
zk0301

后期安卓orm库千千万,用或不用都一样。没有处理db upgreade带来的数据迁移问题,就相当于没写

回复
2021-1-29 09:28:39
鸿蒙张荣超
鸿蒙张荣超

666~~ 如果能把项目源代码打个包作为附件那就更好啦^_^

回复
2021-1-30 19:43:46
回复
    相关推荐