ObjectBox(九)——存儲復(fù)雜數(shù)據(jù)結(jié)構(gòu)

前言

之前講過了ObjectBox對于基本數(shù)據(jù)的存儲等問題,大家感興趣的話可參考
ObjectBox(一)——objectBox簡介
ObjectBox(二)——objectBox配置
ObjectBox(三)——objectBox數(shù)據(jù)庫路徑及自定義路徑
ObjectBox(四)——建立數(shù)據(jù)實體類
ObjectBox(五)——查詢
ObjectBox(六)——增刪改
ObjectBox(七)——數(shù)據(jù)庫的升級
ObjectBox(八)——調(diào)試
那么在遇到比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的時候,我們該怎么去處理呢?今天九讓我們來了解下ObjectBox存儲復(fù)雜數(shù)據(jù)結(jié)構(gòu)吧。

今天涉及內(nèi)容:

  1. 要存儲的復(fù)雜數(shù)據(jù)結(jié)構(gòu)介紹
  2. 數(shù)據(jù)結(jié)構(gòu)的建立
  3. 在Activity中進行數(shù)據(jù)庫操作
  4. 效果圖和項目結(jié)構(gòu)圖
  5. 數(shù)據(jù)庫操作類源碼
  6. 數(shù)據(jù)操作具體講解
    6.1 存含對象集合的數(shù)據(jù)
    6.2 存含一個對象的數(shù)據(jù)
    6.3 查詢一條數(shù)據(jù)中的對象
    6.4 刪除和更新復(fù)雜數(shù)據(jù)
    6.5 復(fù)雜數(shù)據(jù)整條刪除需要注意的地方

先來波效果圖


1.gif

\color{#ff0000}{注:當(dāng)前使用ObjectBox 版本為 2.4.1}

一. 要存儲的復(fù)雜數(shù)據(jù)結(jié)構(gòu)介紹

今天要介紹的一個比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)是一個User類,此類中含有以下屬性:

String name;
一個Body的集合,其中body為對象
一個Anmail對象

一共是三個組成,其中由一個name字符串,然后一個body的集合,最后還由一個Anmail對象。
然后下面貼出Body類代碼:

@Entity
public class Body {
    //必須寫一個public的id(id為long數(shù)據(jù)類型)并寫上"@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數(shù)據(jù)類型)并寫上"@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為基礎(chǔ)的model類,這兩個類還是需要添加@Entity注解的,然后還要注意唯一id的問題。
那么,關(guān)于User的基本數(shù)據(jù)結(jié)構(gòu)就是這樣了,接下來繼續(xù)講。

二.數(shù)據(jù)結(jié)構(gòu)的建立

基于ObjectBox庫,其數(shù)據(jù)是自上而下建立的。那么我們可以這樣看,User是數(shù)據(jù)的總構(gòu)成頂端,其下面由字符串對象集合Body對象Animal組成。那么這時候,則涉及到ObjectBox中兩個注解的使用:ToManyToOne。

  • ToMany: 一對多關(guān)系
  • ToOne: 一對一關(guān)系

這兩個注解都是基于"向下"標(biāo)識的,即是用于在頂層User中標(biāo)注其與自己屬性間的關(guān)系。
User類中,UserBody是一對多的關(guān)系,UserAnmail是一對一的關(guān)系,要建立它們之間的關(guān)系,則User類代碼如下:

@Entity
public class User {

    //必須寫一個public的id(id為long數(shù)據(jù)類型)并寫上"@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是一對多的關(guān)系,而ToOne表示了UserAnimal是一對一的關(guān)系。至此復(fù)雜數(shù)據(jù)結(jié)構(gòu)建立完成。

三.在Activity中進行數(shù)據(jù)庫操作

接下來,讓我們看看在Activity中基于復(fù)雜數(shù)據(jù)結(jié)構(gòu)User的添加,刪除等操作。這里我寫了一個Operater類,用于處理User類的數(shù)據(jù)庫操作的具體實現(xiàn),先讓我們看看其在Activity中的使用,后面會具體講復(fù)雜數(shù)據(jù)結(jié)構(gòu)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();
        //初始化數(shù)據(jù)
        initData();
        //設(shè)置監(jiān)聽
        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);
    }

    /**初始化數(shù)據(jù)**/
    private void initData() {
        mOperater=new Operater();
    }

    /**設(shè)置監(jiān)聽**/
    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;
       }
    }
}

四.效果圖和項目結(jié)構(gòu)圖

1.gif

image.png

五. 數(shù)據(jù)庫操作類源碼

下面貼出Operater代碼:

還有 42% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
支付 ¥3.00 繼續(xù)閱讀

友情鏈接更多精彩內(nèi)容