【问题标题】:Storing a string[][]-Array in a database在数据库中存储 string[][]-Array
【发布时间】:2011-07-24 19:40:53
【问题描述】:

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

我想我应该对数组进行序列化和反序列化,不幸的是我在这方面经验不足。因此,我们将不胜感激。

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

【问题讨论】:

    标签: java android serialization


    【解决方案1】:

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

    你没有说你的数组中有什么,但可能另一个表适合这个账单,尽管确定这远远超出了这个问题的范围(虽然它会成为一个很好的新问题)。

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

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

    我更喜欢将我的文本作为文本保存在数据库中,这样我就可以使用众多可用的数据库工具之一来搜索和查看它。我不想运行代码来查看列中的内容,如果我需要在开发过程中手动调整值,我希望能够更新值,而不是运行程序来为我完成。

    【讨论】:

    • 如果您要将其转换为 XML 或 JSON,您仍然需要编写代码将其转换为 XML 文档或 JSON 对象,然后再将其转换回来。然后,您可能会担心“文本中的文本”转义,这在我演示的二进制格式中不需要。
    • 我更新了我的答案。我不需要为转换编写代码 - 我为此使用库。
    【解决方案2】:

    好的,假设不会有空值。写出来:

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

    可以在最后一部分只使用DataOutputStreamwriteUTF 方法,但这会使从非Java 平台读取的难度稍大一些。这取决于您的要求。不过,使用DataOutputStream 通常会更容易处理。例如:

    private static final Charset UTF8 = Charset.forName("UTF-8");
    
    private static byte[] SerializeText(String[][] array)
    {
        int rows = array.length;
    
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        dos.writeInt(rows);
        for (int i = 0; i < rows; i++)
        {
            int columns = array[i].length;
            dos.writeInt(columns);
            for (int j = 0; j < columns; j++)
            {
                byte[] utf8 = array[i][j].getBytes(UTF8);
                dos.writeInt(utf8.length);
                dos.write(utf8, 0, utf8.length);
            }
        }
        dos.flush(); // May not be necessary
        return baos.toByteArray();
    }
    

    【讨论】:

    • 唷,存储一些字符串需要做很多工作。从他的问题来看,听起来他想出了一个解决方案(blob),并试图找到使其工作的代码。没有理由需要将字符串转换为二进制文件以存储在数据库中。
    • @Paul:嗯,看看他之前的问题,看看他之前的“解决方案”是什么。是的,如果您想将字符串的二维数组存储在数据库中(在一个值中),将它们转换为二进制形式似乎是个好主意。
    • 我们必须同意不同意。如果我将文本存储在我的数据库中,那么我希望能够搜索它,或者至少使用 SQL Developer 或 Toad 之类的东西来查看它。像JSON-lib 这样的库支持多维数组的双向序列化。还有什么比这更简单的?
    • @Jon Skeet 谢谢你的回答。不幸的是,每一行可能有不同数量的列,但值不能为空。
    • @Jon Skeet 再次非常感谢您的回答。然而,正如我在我的问题中所说,我在这方面几乎没有经验。我将如何反序列化数据?使用数据输入流?
    【解决方案3】:

    我刚刚发现了一个名为 google gson 的 JSON 库(感谢 this question),而不是 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 太冗长了。

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

    【讨论】:

      【解决方案4】:

      您可以使用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);
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 拒绝接受您自己的答案但没有给出具体的解决方案。什么“Android 便捷方法”?
        猜你喜欢
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多