有没有办法在RushORM中存储盒装基元和字符串列表?像ArrayList<String>
或ArrayList<Integer>
之类的东西?我知道我可以将int / String包装在扩展RushObject
的对象中,但我希望我不必诉诸于此。
我已经尝试过:
@RushList(classType = String.class)
但它不会编译,因为类类型必须扩展RushObject
。
答案 0 :(得分: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);
唯一的缺点是你无法查询列表中的任何内容。
希望有所帮助。
答案 1 :(得分: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};
}
}