ObjectBox简书付费文章

ObjectBox(九)——存储复杂数据结构

2020-07-01  本文已影响0人  奔跑的佩恩

前言

之前讲过了ObjectBox对于基本数据的存储等问题,大家感兴趣的话可参考
ObjectBox(一)——objectBox简介
ObjectBox(二)——objectBox配置
ObjectBox(三)——objectBox数据库路径及自定义路径
ObjectBox(四)——建立数据实体类
ObjectBox(五)——查询
ObjectBox(六)——增删改
ObjectBox(七)——数据库的升级
ObjectBox(八)——调试
那么在遇到比较复杂的数据结构的时候,我们该怎么去处理呢?今天九让我们来了解下ObjectBox存储复杂数据结构吧。

今天涉及内容:

  1. 要存储的复杂数据结构介绍
  2. 数据结构的建立
  3. 在Activity中进行数据库操作
  4. 效果图和项目结构图
  5. 数据库操作类源码
  6. 数据操作具体讲解
    6.1 存含对象集合的数据
    6.2 存含一个对象的数据
    6.3 查询一条数据中的对象
    6.4 删除和更新复杂数据
    6.5 复杂数据整条删除需要注意的地方

先来波效果图


1.gif

\color{#ff0000}{注:当前使用ObjectBox 版本为 2.4.1}

一. 要存储的复杂数据结构介绍

今天要介绍的一个比较复杂的数据结构是一个User类,此类中含有以下属性:

String name;
一个Body的集合,其中body为对象
一个Anmail对象

一共是三个组成,其中由一个name字符串,然后一个body的集合,最后还由一个Anmail对象。
然后下面贴出Body类代码:

@Entity
public class Body {
    //必须写一个public的id(id为long数据类型)并写上"@Id"注解
    //若id不为public。那你至少要提供public 的 set,get方法
    @Id
    private long id;

    private int age;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Body{" +
                "id=" + id +
                ", age=" + age +
                '}';
    }
}

Animal类代码:

@Entity
public class Animal {

    //必须写一个public的id(id为long数据类型)并写上"@Id"注解
    //若id不为public。那你至少要提供public 的 set,get方法
    @Id
    private long id;

    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Animal{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

可以看到,body类和Animail类都很简单,虽然如此,但是作为ObjectBox为基础的model类,这两个类还是需要添加@Entity注解的,然后还要注意唯一id的问题。
那么,关于User的基本数据结构就是这样了,接下来继续讲。

二.数据结构的建立

基于ObjectBox库,其数据是自上而下建立的。那么我们可以这样看,User是数据的总构成顶端,其下面由字符串对象集合Body对象Animal组成。那么这时候,则涉及到ObjectBox中两个注解的使用:ToManyToOne

这两个注解都是基于"向下"标识的,即是用于在顶层User中标注其与自己属性间的关系。
User类中,UserBody是一对多的关系,UserAnmail是一对一的关系,要建立它们之间的关系,则User类代码如下:

@Entity
public class User {

    //必须写一个public的id(id为long数据类型)并写上"@Id"注解
    //若id不为public。那你至少要提供public 的 set,get方法
    @Id
    private long id;

    private String name;
    private ToMany<Body> userToMany;

    private ToOne<Animal>animalToOne;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public ToMany<Body> getUserToMany() {
        return userToMany;
    }

    public void setUserToMany(ToMany<Body> userToMany) {
        this.userToMany = userToMany;
    }

    public ToOne<Animal> getAnimalToOne() {
        return animalToOne;
    }

    public void setAnimalToOne(ToOne<Animal> animalToOne) {
        this.animalToOne = animalToOne;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", userToMany=" + userToMany +
                ", animalToOne=" + animalToOne +
                '}';
    }
}

主要看两行比较重要的代码:

    private ToMany<Body> userToMany;
    private ToOne<Animal>animalToOne;

ToMany表示了UserBody是一对多的关系,而ToOne表示了UserAnimal是一对一的关系。至此复杂数据结构建立完成。

三.在Activity中进行数据库操作

接下来,让我们看看在Activity中基于复杂数据结构User的添加,删除等操作。这里我写了一个Operater类,用于处理User类的数据库操作的具体实现,先让我们看看其在Activity中的使用,后面会具体讲复杂数据结构User的增删改查等操作

public class TempActivity extends AppCompatActivity implements View.OnClickListener{

    private TextView mTv;
    private Button mBtn1;
    private Button mBtn2;
    private Button mBtn3;
    private Button mBtn4;

    private Operater mOperater;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp);

        //初始化控件
        initView();
        //初始化数据
        initData();
        //设置监听
        setListener();
    }

    /**初始化控件**/
    private void initView(){
        mTv=findViewById(R.id.tv);
        mBtn1=findViewById(R.id.btn1);
        mBtn2=findViewById(R.id.btn2);
        mBtn3=findViewById(R.id.btn3);
        mBtn4=findViewById(R.id.btn4);
    }

    /**初始化数据**/
    private void initData() {
        mOperater=new Operater();
    }

    /**设置监听**/
    private void setListener(){
        mBtn1.setOnClickListener(this);
        mBtn2.setOnClickListener(this);
        mBtn3.setOnClickListener(this);
        mBtn4.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
       switch (v.getId()) {
           case R.id.btn1://测试1
               LogUtil.i("=======添加=======");
               mOperater.add();
               break;
           case R.id.btn2://测试2
               LogUtil.i("=======查询=======");
               String message1=mOperater.check();
               mTv.setText(message1);
               break;
           case R.id.btn3://测试3
               LogUtil.i("=======删除单个对象=======");
               mOperater.deleteAnimal();
               break;
           case R.id.btn4://测试4
               LogUtil.i("=======删除所有=======");
               String message2=mOperater.deleteAll();
               mTv.setText(message2);
               break;
           default:
               break;
       }
    }
}

四.效果图和项目结构图

1.gif
image.png

五. 数据库操作类源码

下面贴出Operater代码:

上一篇 下一篇

猜你喜欢

热点阅读