前言
之前講過了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)容:
- 要存儲的復(fù)雜數(shù)據(jù)結(jié)構(gòu)介紹
- 數(shù)據(jù)結(jié)構(gòu)的建立
- 在Activity中進行數(shù)據(jù)庫操作
- 效果圖和項目結(jié)構(gòu)圖
- 數(shù)據(jù)庫操作類源碼
- 數(shù)據(jù)操作具體講解
6.1 存含對象集合的數(shù)據(jù)
6.2 存含一個對象的數(shù)據(jù)
6.3 查詢一條數(shù)據(jù)中的對象
6.4 刪除和更新復(fù)雜數(shù)據(jù)
6.5 復(fù)雜數(shù)據(jù)整條刪除需要注意的地方
先來波效果圖

一. 要存儲的復(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中兩個注解的使用:ToMany和ToOne。
- ToMany: 一對多關(guān)系
- ToOne: 一對一關(guān)系
這兩個注解都是基于"向下"標(biāo)識的,即是用于在頂層User中標(biāo)注其與自己屬性間的關(guān)系。
在User類中,User與Body是一對多的關(guān)系,User與Anmail是一對一的關(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表示了User和Body是一對多的關(guān)系,而ToOne表示了User和Animal是一對一的關(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)圖


五. 數(shù)據(jù)庫操作類源碼
下面貼出Operater代碼: