2016-01-26 31 views
1

有沒有什麼方法可以在RushORM中存儲裝箱原語和字符串列表?像ArrayList<String>ArrayList<Integer>?我知道我可以將int/String包裝在一個擴展爲RushObject的對象中,但我希望我不必訴諸於此。存儲裝箱原語/字符串的列表?

我已經嘗試: @RushList(classType = String.class) 但它不會編譯的類類型必須擴展RushObject

回答

1

你想要做的是爲那些盒裝原語實現自己的自定義列類型。

你將不得不做的唯一的事情是切換到一個數組字符串[]或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); 

唯一的失敗是你不能查詢任何東西是列表。

希望有所幫助。

+0

你只是讓我意識到,我聲明爲ArrayLists的字段不會改變太多,所以通過將它們轉換爲數組併爲其添加自定義列,這在技術上解決了我的問題。 感謝您的幫助! – nulldev