一 需求:
项目中用到了GreenDao,需要在其里表里加个属性面保存一个list<Bean>。
二 思路:
都是通过实现GreenDao的PropertyConverter实现的。首先考虑下如果是String类型的数据,遍历List然后将所有的String对象都append到一个容器中,然后保存在数据库中即可。若是bean类型的则通过gson将其转为json保存到数据库中。
三 泛型为Bean的实现
1 Converter类
// 1首先实现PropertyCOnverter接口,将bean转为json保存
public class InfoConverter implements PropertyConverter<List<InfoBean>, String> {
@Override
public List<InfoBean> convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
String[] list_str = databaseValue.split("~");
List<InfoBean> list_transport = new ArrayList<>();
for (String s : list_str) {
list_transport.add(new Gson().fromJson(s, InfoBean.class));
}
return list_transport;
}
@Override
public String convertToDatabaseValue(List<InfoBean> arrays) {
if (arrays == null) {
return null;
} else {
StringBuilder sb = new StringBuilder();
for (InfoBean array : arrays) {
String str = new Gson().toJson(array,InfoBean.class);
sb.append(str);
sb.append("~");
}
return sb.toString();
}
}
}
2 实体类
@Entity
public class Demo {
@Id(autoincrement = true)
private Long id;
private String dateTime;
@Convert(columnType = String.class,converter = InfoConverter.class)
private List<InfoBean> list;
@Generated(hash = 1944588636)
public Demo(Long id, String dateTime, List<InfoBean> list) {
this.id = id;
this.dateTime = dateTime;
this.list = list;
}
@Generated(hash = 571290164)
public Demo() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getDateTime() {
return this.dateTime;
}
public void setDateTime(String dateTime) {
this.dateTime = dateTime;
}
public List<InfoBean> getList() {
return this.list;
}
public void setList(List<InfoBean> list) {
this.list = list;
}
@Override
public String toString() {
return "Demo{" +
"id=" + id +
", dateTime='" + dateTime + '\'' +
", list=" + list +
'}';
}
}
public class InfoBean {
private String x;
private String y;
public InfoBean(String x, String y) {
this.x = x;
this.y = y;
}
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
@Override
public String toString() {
return "InfoBean{" +
"x='" + x + '\'' +
", y='" + y + '\'' +
'}';
}
}
四 测试
public class MainActivity extends AppCompatActivity {
private DaoSession daoSession;
private DaoMaster daoMaster;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "test.db", null);
daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
daoSession = daoMaster.newSession();
findViewById(R.id.btn_add).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DemoDao demoDao = daoSession.getDemoDao();
demoDao.insert(getDemo());
}
});
findViewById(R.id.btn_query).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Demo> demoList = daoSession.getDemoDao().loadAll();
for (int i = 0; i < demoList.size(); i++) {
Log.e("----------", demoList.get(i).toString());
}
}
});
findViewById(R.id.btn_delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
daoSession.getDemoDao().deleteAll();
}
});
}
private Demo getDemo() {
Demo demo = new Demo();
demo.setDateTime("2020.10.");
demo.setList(getInfoList());
return demo;
}
private List<InfoBean> getInfoList() {
List<InfoBean> infoBeanList = new ArrayList<>();
for (int i = 0; i < 2; i++) {
InfoBean infoBean = new InfoBean("test" + i, "测试" + i);
infoBeanList.add(infoBean);
}
return infoBeanList;
}
}