2014-07-08 16 views
0

我正在將字符串列表保存並加載到數據庫。如何在從字符串保存/加載時處理空列表?

爲了節省,我做的:list.toString()

並加載,我用:Arrays.asList(string.split("\\s*,\\s*"))

然而,當我保存一個空的列表,它被裝到一個列表中的一個元素,空字符串""

避免這種情況的最佳方法是什麼?

+0

if(empty)return null; ? –

+0

@ Vash-DamianLeszczyński如果我真的擁有一個含有元素''「'的列表?我需要一種方法來正確地返回一個空字符串的列表,如果我用一個空字符串開始列表,並返回一個沒有元素的列表,如果我開始時沒有元素的列表。 – iBelieve

+0

@Unihedron如果我有一個帶有[[「」]'的列表,我想要一種方法將其保存爲一個字符串並從中加載'[「」]'。如果我有'[]',我現在得到'[「」]',而不是正確的[]'。 – iBelieve

回答

2

無論如何,這是一個壞主意,想想一個字符串包含引號或逗號的情況。

你應該使用一個正確的序列化工具將它們轉義出來。 CSV,JSON或XML解析器將全部滿足您的需求。

1

在你保存機制:

if(list.isEmpty()){ 
    return null; 
} 

和加載:

if (string == null) 
    return empty list; 
0

最好的辦法是停止節省數據庫列爲昏迷分隔的字符串。在處理數據庫時,這不是處理列表的常用方法。如果是關係型數據庫,則使用外鍵創建表,並將其列表的每個元素存儲在其記錄中。閱讀時使用連接。

如果您正在使用noSQL DB,請檢查您的數據庫提供的列表。例如,Cassandra支持CQL的列表類型。

但作爲一個臨時工作使用if語句使用空字符串。確定你想要什麼創建:空列表或null和做類似:

List<String> list = "".equals(str) ? Collections.emptyList() : str.split("\\s*,\\s*"); 
1

的問題發生在舞臺當您保存列表:與一個空字符串列表產生輸出作爲toString()相同呼叫一個空的列表(即一個"")。

但是,根本問題是您沒有在適合存儲列表的數據庫結構中保存列表 - 即通過外鍵與父表相關的單獨表。這將是我將要探索的第一種方法 - 添加一個單獨的表格,並在那裏存儲列表元素。這會使解析問題變得無關緊要。

如果你堅持把一個列表存儲爲一個單一的值,你需要制定一個方案,以便爲這兩個條件產生不同的字符串。例如,您可以編寫自己的toString方法,在最後一個元素之後附加一個逗號,並截掉String.split結果的最後一個元素。

相關問題