1

有没有办法在 RushORM 中存储盒装原语和字符串列表?像ArrayList<String>or的东西ArrayList<Integer>?我知道我可以将 int/String 包装在一个扩展的对象中,RushObject但我希望我不必诉诸于此。

我已经尝试过: @RushList(classType = String.class) 但它不会编译,因为类类型必须扩展RushObject

4

2 回答 2

1

您想要做的是为那些装箱的原语实现您自己的自定义列类型。

您唯一需要做的就是将它们切换为 Array String[] 或 int[],因为您无法使用 ArrayList 获取类型。这是一个 int[] 自定义列。

public class IntArrayColumn implements RushColumn<int[]> {

    private static final String DELIMITER = ",";

    @Override
    public String sqlColumnType() {
        return "varchar(255)";
    }

    @Override
    public String serialize(int[] ints, RushStringSanitizer rushStringSanitizer) {
        return rushStringSanitizer.sanitize(join(ints));
    }

    @Override
    public int[] deserialize(String s) {
        return split(s);
    }

    @Override
    public Class[] classesColumnSupports() {
        return new Class[]{int[].class};
    }

    private String join(int[] ints) {
        if (ints.length > 0) {
            StringBuilder sbuild = new StringBuilder();
            for (int i = 0; i < ints.length; i++) {
                sbuild.append(ints[i]).append(DELIMITER);
            }
            sbuild.delete(sbuild.lastIndexOf(DELIMITER), sbuild.length());
            return sbuild.toString();
        } else {
            return "";
        }
    }

    private int[] split(String source) {
        if (source != null) {
            if (source.isEmpty()) {
                return new int[0];
            }
            String[] items = source.split(DELIMITER);
            int[] ints = new int[items.length];
            for (int i = 0; i < ints.length; i++) {
                ints[i] = Integer.valueOf(items[i]);
            }
            return ints;
        }
        return null;
    }
}

然后将初始化函数更改为如下所示。

AndroidInitializeConfig config = new AndroidInitializeConfig(getApplicationContext());
config.addRushColumn(new IntArrayColumn());
RushCore.initialize(config);

唯一的缺点是您将无法查询列表中的任何内容。

希望有帮助。

于 2016-01-27T09:56:54.537 回答
0

找到了一个更短更简单的方法。
因为我不想在我的 POJO 中将 List 更改为 Array

public class ListStringColumn implements RushColumn<List<String>> {
  @Override
  public String sqlColumnType() {
    return "varchar(255)";
  }
  @Override
  public String serialize(List<String> object, RushStringSanitizer stringSanitizer) {
    return stringSanitizer.sanitize(new Gson().toJson(object.toArray()));
  }
  @Override
  public List<String> deserialize(String value) {
    return new Gson().fromJson(value, new TypeToken<List<String>>(){}.getType());
  }
  @Override
  public Class[] classesColumnSupports() {
    return new Class[]{List.class};
  }
}
于 2019-04-28T09:03:37.157 回答