1

我正在使用rushorm进行 sqlite 对象序列化和存储。到目前为止它工作得非常酷。问题是我不想存储以下Request对象:

public class Request extends RushObject {

    private String url;
    private RequestParamsStorable params;

    public Request() {}

    public Request(String aUrl, RequestParamsStorable aParams)
    {
        this.url = aUrl;
        this.params = aParams;
    }

    public String getUrl()
    {
        return this.url;
    }

    public RequestParams getParams()
    {
        return this.params;
    }

}

如您所见,我需要存储 RequestParams 对象。为了存储它,因为我显然无法扩展它,所以RushObject我创建了一个子类并根据文档说明使其实现 Rush:

public class RequestParamsStorable extends RequestParams implements Rush {

    public RequestParamsStorable() {}

    @Override
    public void save() { RushCore.getInstance().save(this); }
    @Override
    public void save(RushCallback callback) { RushCore.getInstance().save(this, callback); }
    @Override
    public void delete() { RushCore.getInstance().delete(this); }
    @Override
    public void delete(RushCallback callback) { RushCore.getInstance().delete(this, callback); }
    @Override
    public String getId() { return RushCore.getInstance().getId(this); }
}

它没有抛出任何错误,并且save()Request对象的调用很顺利。当我要求这样的存储对象时:

    List<Request> remainingsInDB = new RushSearch().find(Request.class);

我确实收到Request了正确的存储对象,url但是RequestParamsStorable是空的(“”)。我检查过,当我保存它们时,它们肯定有值,并且不是空的。

所以问题是我错在哪里?

问候,

4

2 回答 2

1

如果您的父类RequestParams包含声明为final的字段,它们将不会被恢复。

作为参考,您可以查看 RushORM 源​​代码

反射类加载器.java

    for (Field field : fields) {
        field.setAccessible(true);
        if (!annotationCache.get(clazz).getFieldToIgnore().contains(field.getName())) {
            if (!loadJoinField(object, rushColumns, annotationCache, field, joins, joinTables)) {
                if(rushColumns.supportsField(field)) {
                    String value = values.get(counter);
                    if(value != null && !value.equals("null")) {
                        rushColumns.setField(object, field, value);
                    }
                    counter++;
                }
            }
        }
    }

您应该删除字段的最终修饰符或创建将存储在数据库中的包装器对象,然后从中恢复 RequestParams

于 2015-09-30T07:50:20.310 回答
0

好的,问题确实是final在 RequestParams 中声明的字段。@Stuart Campbell 正确记录了RequestParams参考。现在我尝试的解决方法是将所有属性(Wrappers 除外)存储为JSONObject,将其存储JSONObjectString,然后从中恢复状态。我面临一些问题,JsonWritter但尚未解决我的问题。不确定在此处发布相关代码或发布新问题是否是个好主意?

于 2015-10-01T12:15:10.493 回答