概述
注:基本使用可结合Android jetpack Room数据库(一)基本使用 去看
1.对象包含单个对象
1.1.直接用@Embedded
作用:将里面对象的属性当成列嵌入到外层对象生成的表中
注意:两个对象中如果存在相同的名称,需要用@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.用TypeConverters转换
作用:将对象转为字符串当成一个字段存在表中.
1.2.1.定义Department的转换类,如下:
public class DepartmentConvert {
@TypeConverter
public Department revert(String jsonString) {
// 使用Gson方法把json格式的string转成T
try {
Type type = new TypeToken<Department>(){}.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<T> {
@TypeConverter
public T revert(String jsonString) {
// 使用Gson方法把json格式的string转成T
try {
Type type = new TypeToken<T>(){}.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<Department> {
}
2.对象包含一个对象的集合<List>
内容如下,对象中包含集合:
@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<Department> departments;
public String testField1;
。。。
}
2.1.用convert直接存
2.1.1.新建一个转list的Convert基类
public class BaseListConvert<T> {
@TypeConverter
public List<T> revert(String jsonString) {
// 使用Gson方法把json格式的string转成List
try {
Type type = new TypeToken<ArrayList<T>>(){}.getType();
List<T> list = new Gson().fromJson(jsonString,type);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@TypeConverter
public String converter(List<T> list) {
// 使用Gson方法把List转成json格式的string,便于我们用的解析
return new Gson().toJson(list);
}
}
2.1.2.新建转ListDepartment的convert类
//直接集成自BaseListConvert,将类型传进去就行了
public class DepartmentListConvert extends BaseListConvert<Department> {
}
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将数据查出来看一下
成功查询出和原始数据一样的数据
2.2.通过relation进行数据存取
复杂且已经有以上替换方案,略,后续有时间再补
2.3.通过ForeignKey进行关联存取
复杂且已经有以上替换方案,略,后续有时间再补
————————————————
版权声明:本文为CSDN博主「肖波86440」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012962759/article/details/106841166
最后
以上就是危机香菇为你收集整理的jetpack Room数据库(三)复杂数据存取的全部内容,希望文章能够帮你解决jetpack Room数据库(三)复杂数据存取所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复