**在上一章中介绍了如何简单使用GreenDao,并创建了User类来保存一些简单的数据。
但是假如在User中有一种List类型的数据也需要保存到数据库中,该如何处理呢??**
答案很简单,可以转换一下思路,遍历List数据,然后将所有的String对象都append到一个StringBuilder中,然后保存在数据库中即可。
事实上,GreenDao已经为我们考虑到了这种情况,因此才有了 PropertyConverter 这个接口
在PropertyConverter接口中,有两个需要实现的抽象方法
//将数据库中的值,转化为实体Bean类对象(比如List<String>)
P convertToEntityProperty(D databaseValue);
//将实体Bean类(比如List<String>)转化为数据库中的值(比如String)
D convertToDatabaseValue(P entityProperty);
具体实现如下所示:
package com.example.extdannyjiang.greendaodemo.utils;
import org.greenrobot.greendao.converter.PropertyConverter;
import java.util.Arrays;
import java.util.List;
/**
* Created by danny.jiang on 17/6/20.
*/
public class StringConverter implements PropertyConverter<List<String>, String>{
@Override
public List<String> convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
else {
List<String> list = Arrays.asList(databaseValue.split(","));
return list;
}
}
@Override
public String convertToDatabaseValue(List<String> entityProperty) {
if(entityProperty==null){
return null;
}
else{
StringBuilder sb= new StringBuilder();
for(String link:entityProperty){
sb.append(link);
sb.append(",");
}
return sb.toString();
}
}
}
具体使用
首先创建User对象,如下所示:
@Entity // 用于标识这是一个需要Greendao帮我们生成代码的bean
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "user_name")
@NotNull
private String name;
@Convert(columnType = String.class, converter = StringConverter.class)
private List<String> nickNames;
}
以上代码的nickNames是一个List< String > 类型,因此需要使用Converter进行转化,具体指定Converter的方法就是添加@Converter注解。 User写好之后,可以编译一下工程,然后studio会为我们自动创建UserDao类
然后看一下布局文件:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editUserName"
android:hint="please input user name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/editUserNickName1"
android:hint="please input user name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/editUserNickName2"
android:hint="please input user name"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:text="创建数据库"
android:onClick="createDatabase"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:text="插入数据"
android:onClick="insert"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
最后看一下MainActivity.java中的关键代码:
public class MainActivity extends AppCompatActivity {
private EditText editName;
private EditText editNickName1;
private EditText editNickName2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editName = ((EditText) findViewById(R.id.editUserName));
editNickName1 = ((EditText) findViewById(R.id.editUserNickName1));
editNickName2 = ((EditText) findViewById(R.id.editUserNickName2));
}
}
/**
* 点击创建数据库Button时,调用此方法创建数据库
*/
public void createDatabase(View view) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "user.db");
daoMaster = new DaoMaster(helper.getWritableDb());
daoSession = daoMaster.newSession();
userDao = daoSession.getUserDao();
orderDao = daoSession.getMyOrderDao();
}
/**
* 点击插入数据Button时,调用此方法插入一条User数据
*/
public void insert(View view) {
User user = new User();
user.setName(editName.getText().toString());
List<String> nickNames = new ArrayList<>();
String nickName1 = editNickName1.getText().toString();
String nickName2 = editNickName2.getText().toString();
nickNames.add(nickName1);
nickNames.add(nickName2);
user.setNickNames(nickNames);
long insertID = userDao.insert(user);
if (insertID >= 0) {
Toast.makeText(this, "插入 User 成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "插入User 失败", Toast.LENGTH_SHORT).show();
}
}
具体使用方式,可以参考GreenDaoDemo : GreenDaoDemo