作用:将里面对象的属性当成列嵌入到外层对象生成的表中
注意:两个对象中如果存在相同的名称,需要用@ColumnInfo注解重新定义列名或者用@Embedded(prefix = "department")增加前缀,保证列名不重复。否则会报错:
错误: Multiple fields have the same columnName: id. Field names: id, department > id.
1.1.1.看一下Department的定义
public class Department {
@ColumnInfo(name = "departmentId")
public int id;
@ColumnInfo(name = "departmentName")
public String name;
public Department() {
}
@Ignore
public Department(int id, String name) {
this.id = id;
this.name = name;
}
}
1.1.2.然后插入数据,插入的数据内容如下
{"department":{"id":1,"name":"公司领导"},"id":1,"userAge":10,"userName":"user001"}
1.1.3.看一下数据库:
OK,可以看到已经成功完成对象嵌套对象的数据类型数据库插入。
1.1.4.咱们再将数据取出来看看是不是原来的格式,
new Thread(new Runnable() {
@Override
public void run() {
String name=dataBinding.etName.getText().toString().trim();
User user=AppDataBase.getInstance(MainActivity.this).userDao().getUserInfoByName(name);
Log.e("database userGet ",GsonUtils.toString(user));
}
}).start();
看到如下,和存入时一模一样:
作用:将对象转为字符串当成一个字段存在表中.
1.2.1.定义Department的转换类,如下:
public class DepartmentConvert {
@TypeConverter
public Department revert(String jsonString) {
// 使用Gson方法把json格式的string转成T
try {
Type type = new TypeToken(){}.getType();
Department data = new Gson().fromJson(jsonString,type);
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@TypeConverter
public String converter(Department data) {
// 使用Gson方法把 T 转成json格式的string,便于我们用的解析
return new Gson().toJson(data);
}
}
1.2.2.在咱们的user类上面加上TypeConverters注解
告诉room遇到对应的字段怎么存取,注意department字段不需要再做任何操作
@Entity(tableName = "user",ignoredColumns = {"testField1"}) //实体类创建需要加上@Entity注解
@TypeConverters({DepartmentConvert.class})
public class User {
@PrimaryKey @NonNull
public int id;
@ColumnInfo(name = "user_name")
public String userName;
@ColumnInfo(name = "user_age")
public int userAge;
@ColumnInfo(name = "user_mobile")
public String userMobile;
/**
* 只是单个对象,不是List/set
* 直接用@Embedded 嵌入到user表中,即user表中的列将根据Department的属性增加
*/
// @Embedded
// public Department department;
public Department department;
。。。
}
1.2.3.插入数据
{"department":{"id":1,"name":"公司领导"},"id":1,"userAge":10,"userName":"user001"}
1.2.4.查看一下数据表,已经将department字段转成字符串存在department列了,如图:
1.2.5.再通过名称查出数据看看,如图:
OK,也一样的能成功的取出和存入时一样的数据.
注意:Convert类不能提取成基类,否则在存的时候没问题,取的时候会报错:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.paramtest.roomTest.entities.Department
错误示范:
public class BaseDataCovert {
@TypeConverter
public T revert(String jsonString) {
// 使用Gson方法把json格式的string转成T
try {
Type type = new TypeToken(){}.getType();
T data = new Gson().fromJson(jsonString,type);
// T data = GsonUtils.fromLocalJson(jsonString,type);
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@TypeConverter
public String converter(T data) {
// 使用Gson方法把 T 转成json格式的string,便于我们用的解析
return new Gson().toJson(data);
}
}
//只需要继承自咱们定义的BaseDataCovert类,这不行
public class DepartmentConvert extends BaseDataCovert {
}
内容如下,对象中包含集合:
@Entity(tableName = "user", ignoredColumns = {"testField1"}) //实体类创建需要加上@Entity注解
public class User {
@PrimaryKey
@NonNull
public int id;
@ColumnInfo(name = "user_name")
public String userName;
@ColumnInfo(name = "user_age")
public int userAge;
@ColumnInfo(name = "user_mobile")
public String userMobile;
/**
* 只是单个对象,不是List/set
* 直接用@Embedded 嵌入到user表中,即user表中的列将根据Department的属性增加
*/
// @Embedded
// public Department department;
// public Department department;
//对象中含有集合
public List departments;
public String testField1;
。。。
}
2.1.1.新建一个转list的Convert基类
public class BaseListConvert {
@TypeConverter
public List revert(String jsonString) {
// 使用Gson方法把json格式的string转成List
try {
Type type = new TypeToken>(){}.getType();
List list = new Gson().fromJson(jsonString,type);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@TypeConverter
public String converter(List list) {
// 使用Gson方法把List转成json格式的string,便于我们用的解析
return new Gson().toJson(list);
}
}
2.1.2.新建转ListDepartment的convert类
//直接集成自BaseListConvert,将类型传进去就行了
public class DepartmentListConvert extends BaseListConvert {
}
2.1.3.在user类增加TypeConverters
2.1.4.向数据库插入数据
{"departments":[{"id":1,"name":"公司领导"},{"id":2,"name":"软件部"}],"id":1,"userAge":10,"userName":"user001"}
2.1.5.查看数据库是否成功插入数据
已经将list字段成功插入到数据库
2.1.6.通过名称user001将数据查出来看一下
成功查询出和原始数据一样的数据
复杂且已经有以上替换方案,略,后续有时间再补
复杂且已经有以上替换方案,略,后续有时间再补