存储盒装基元/字符串的列表?

问题描述 投票:1回答:2

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

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

java android orm rushorm
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;
    }
}

然后将initialize函数更改为如下所示。

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

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

希望有所帮助。


0
投票

找到了一种更短,更简单的方法。 因为我不想在我的POJO中更改List to 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};
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.