存储字符串[] [] - 数组中的数组

时间:2011-07-24 19:40:53

标签: java android serialization

我想将一个字符串[] [] - 数组存储在数据库中作为数据类型“blob”。我刚刚发现我必须转换它,否则数据几乎会丢失。 最好的方法是什么?

我想我应该对数组进行序列化和反序列化,不幸的是我在那个领域并不是很有经验。所以任何帮助都会受到赞赏。

PS:我想我应该说我需要在Android上这样做,因此使用SQLite。字符串[] []没有固定数量的行或列。

5 个答案:

答案 0 :(得分:3)

为什么要一个blob?为什么不是clob?或者更好的是,为什么不是varchar?根据您要对数据执行的操作,您应该将数据存储为varchar列中的xml或json。如有必要,它也可以搜索。

你没有说你的阵列中有什么,但可能另一张桌子符合这个法案,虽然确定这远远超出了这个问题的范围(尽管这会产生一个很好的新问题)。

不,最好将数组序列化为文本并将其存储为原样。

编辑...像JSON-lib这样的库支持多维数组的双向序列化。只需通过JSON-lib运行您的数组以获取JSON字符串,存储该字符串,然后在您希望数组返回时通过JSON-lib运行字符串。

我更喜欢我的文本作为文本存在于数据库中,因此我可以搜索它并使用许多可用的数据库工具之一查看它。我不想运行代码来查看列中的内容,如果我需要在开发期间手动调整值,我希望能够更新值,而不是运行程序来为我做。

答案 1 :(得分:2)

好的,假设没有空值。写出:

  • “行”的数量,作为固定的4字节值
    • 对于每个“行”:
    • “列”的数量为固定的4字节值
    • 对于每个字符串:
      • 以字节为单位转换字符串,例如在UTF-8(text.getBytes("UTF-8")
      • 将字节数写为固定的4字节值
      • 写出字符串
      • 的数据

可能只使用DataOutputStream的{​​{1}}方法作为最后一部分,但这会使得从非Java平台读取起来稍微困难一些。这取决于您的要求。使用writeUTF会使一般情况下更容易处理。例如:

DataOutputStream

答案 2 :(得分:2)

我刚刚发现了一个名为this question的JSON库(感谢google gson),而不是XML。

您只需将.jar添加到类路径中,我就会为您提供序列化和反序列化的代码:

import com.google.gson.Gson;

public class JsonTest {

    public static void main(String[] args) {

        String[][] fruits = { { "Banana", "Apple", "Blueberry" }, { "Cherry" }, { "Lemon", "Mango" } };

        Gson gson = new Gson();

        // Serialization
        String json = gson.toJson(fruits);

        // Print: [["Banana","Apple","Blueberry"],["Cherry"],["Lemon","Mango"]]
        System.out.println(json);

        // Deserialization
        String[][] result = gson.fromJson(json, String[][].class);

    }
}

我很高兴找到这个库,XML太冗长了。

(抱歉拼写错误,我是法国人。)

答案 3 :(得分:1)

您可以使用xstream库将其存储为xml。

由于xml标签不是很有效,但它运行良好且易于使用:

String[][] strs = {
    { "row1_col1", "row1_col2", "row1_col3" },
    { "row2_col1" },
    { "row3_col1", "row3_col2" }
};

XStream xstream = new XStream();
xstream.alias("saa", String[][].class);
xstream.alias("sa", String[].class);
xstream.alias("s", String.class);

String xml = xstream.toXML(str);

System.out.println(xml);

结果:

<saa>
  <sa>
    <s>row1_col1</s>
    <s>row1_col2</s>
    <s>row1_col3</s>
  </sa>
  <sa>
    <s>row2_col1</s>
  </sa>
  <sa>
    <s>row3_col1</s>
    <s>row3_col2</s>
  </sa>
</saa>

反序列化:

String[][] strs = (String[][])xstream.fromXML(xml);

答案 4 :(得分:-1)

我找到了一个适合我的解决方案。

主要问题是显然BLOB没有在数据库中正确保存。我使用Android便捷方法来更新数据库,现在它比我最初预期的更好。