RushORM 存储 RequestParams
RushORM store RequestParams
我正在使用 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); }
}
它没有抛出任何错误并且在 Request
对象上调用 save()
顺利进行。当我要求存储这样的对象时:
List<Request> remainingsInDB = new RushSearch().find(Request.class);
我确实收到了存储的 Request
对象,具有适当的 url
,但是 RequestParamsStorable
是空的(“”)。我检查过,当我保存它们时,它们肯定有值,而且不是空的。
所以问题是我哪里错了?
此致,
如果您的父 class RequestParams 包含声明为 final 的字段,它们将不会被恢复。
作为参考,您可以查看 RushORM 源代码
ReflectionClassLoader.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++;
}
}
}
}
您应该删除字段的 final 修饰符或创建将存储在数据库中的包装对象,然后从中恢复 RequestParams
好的,问题确实是在 RequestParams 中声明为 final
的字段。 @Stuart Campbell 正确注明了 RequestParams 参考资料。现在我正在尝试的解决方法是将所有属性(Wrappers 除外)存储为 JSONObject
,将此 JSONObject
存储为 String
,然后从中恢复状态。我在使用 JsonWritter
时遇到了一些问题,但我的问题还没有解决。不确定在此处 post 相关代码还是 post 新问题是个好主意?
我正在使用 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); }
}
它没有抛出任何错误并且在 Request
对象上调用 save()
顺利进行。当我要求存储这样的对象时:
List<Request> remainingsInDB = new RushSearch().find(Request.class);
我确实收到了存储的 Request
对象,具有适当的 url
,但是 RequestParamsStorable
是空的(“”)。我检查过,当我保存它们时,它们肯定有值,而且不是空的。
所以问题是我哪里错了?
此致,
如果您的父 class RequestParams 包含声明为 final 的字段,它们将不会被恢复。
作为参考,您可以查看 RushORM 源代码
ReflectionClassLoader.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++;
}
}
}
}
您应该删除字段的 final 修饰符或创建将存储在数据库中的包装对象,然后从中恢复 RequestParams
好的,问题确实是在 RequestParams 中声明为 final
的字段。 @Stuart Campbell 正确注明了 RequestParams 参考资料。现在我正在尝试的解决方法是将所有属性(Wrappers 除外)存储为 JSONObject
,将此 JSONObject
存储为 String
,然后从中恢复状态。我在使用 JsonWritter
时遇到了一些问题,但我的问题还没有解决。不确定在此处 post 相关代码还是 post 新问题是个好主意?