项目实训(六)greenDao存列表以及一对一关系的坑

在更改数据库结构,比如增加表修改字段什么的首先要保证数据库升级,否则会直接崩。

在app的gradle里向上修改版本号即可,没有的话加上,


greendao {
    schemaVersion 2
}

原数据库内容会清空。

 

1.我在这张表里有一个List和一个自定义object。list是不能直接存的,要借助转换器;

 @Convert(columnType = String.class, converter = StringConverter.class)
    private List nickNames;

转换器其实就是对象转string和转回来的策略:

public class StringConverter implements PropertyConverter, String> {

    @Override
    public List convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        else {
            List list = Arrays.asList(databaseValue.split(","));
            return list;
        }
    }

    @Override
    public String convertToDatabaseValue(List entityProperty) {
        if(entityProperty==null){
            return null;
        }
        else{
            StringBuilder sb= new StringBuilder();
            for(String link:entityProperty){
                sb.append(link);
                sb.append(",");
            }
            return sb.toString();
        }
    }
}

 

2.一对一关系,表中含有另一个自定义的类对象UrlDBModel icon_url,需要建立映射关系。这里是一对一的关系,所以注解是ToOne,注解中传入的是外键对应的名字,刚开始我以为框架会根据这个string自动在表中生成一个外键字段,这才混乱了,后来发现不是,这个字符串对应的是你自己定义的一个存在的外键,比如这里我传入了iconUrlId,那么就要有一个Long iconUrlId。表中存的也就是这个外键,对应UrlDBModel的主键,当然,UrlDBModel也要用框架注解生成表和工具类。

@ToOne(joinProperty = "iconUrlId")
    private UrlDBModel icon_url;
    private Long iconUrlId;

接着我在使用insert插入数据行之后再取出的时候发现取出的UrlDBModel为空,后来发现是因为我在setUrlDBModel的时候传入的UrlDBModel的id还是空的,来看一下框架生成的setter:

    @Generated(hash = 1697832342)
    public void setIcon_url(UrlDBModel icon_url) {
        synchronized (this) {
            this.icon_url = icon_url;
            iconUrlId = icon_url == null ? null : icon_url.getId();
            icon_url__resolvedKey = iconUrlId;
        }
    }

它没有判断id是否为空而是直接作为外键了,接着看getter方法会发现它是根据这个外键Id去UrlDBModel表中取,那么也就肯定取不到了。

于是每次我都把时间戳作为id设置给UrlModel,先存进UrlModel中。然后在将其作为本表的字段,储存本表数据。这样就确保本表可以通过外键找到UrlModel,也就没问题了。

你可能感兴趣的:(实训)