Android jetpack Room数据库(三)复杂数据存取

注:基本使用可结合Android jetpack Room数据库(一)基本使用 去看

1.对象包含单个对象

1.1.直接用@Embedded

作用:将里面对象的属性当成列嵌入到外层对象生成的表中

Android jetpack Room数据库(三)复杂数据存取_第1张图片

 

注意:两个对象中如果存在相同的名称,需要用@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(){}.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列了,如图:

Android jetpack Room数据库(三)复杂数据存取_第2张图片

 

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 { 

​ }     

       

 

2.对象包含一个对象的集合

内容如下,对象中包含集合:

@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.用convert直接存

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

Android jetpack Room数据库(三)复杂数据存取_第3张图片

 

2.1.4.向数据库插入数据

{"departments":[{"id":1,"name":"公司领导"},{"id":2,"name":"软件部"}],"id":1,"userAge":10,"userName":"user001"}

2.1.5.查看数据库是否成功插入数据

已经将list字段成功插入到数据库

Android jetpack Room数据库(三)复杂数据存取_第4张图片

 

2.1.6.通过名称user001将数据查出来看一下

成功查询出和原始数据一样的数据

 

2.2.通过relation进行数据存取

复杂且已经有以上替换方案,略,后续有时间再补

2.3.通过ForeignKey进行关联存取

复杂且已经有以上替换方案,略,后续有时间再补

你可能感兴趣的:(Android)