我是靠谱客的博主 危机香菇,最近开发中收集的这篇文章主要介绍jetpack Room数据库(三)复杂数据存取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

注:基本使用可结合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数据库(三)复杂数据存取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部