【发布时间】:2011-07-24 19:40:53
【问题描述】:
我想在数据库中存储一个字符串[][] 数组作为数据类型“blob”。我刚刚发现我必须转换它,否则数据实际上会丢失。 最好的方法是什么?
我想我应该对数组进行序列化和反序列化,不幸的是我在这方面经验不足。因此,我们将不胜感激。
PS:我想我应该说我需要在 Android 上这样做,因此使用 SQLite。 string[][] 没有固定的行数或列数。
【问题讨论】:
标签: java android serialization
我想在数据库中存储一个字符串[][] 数组作为数据类型“blob”。我刚刚发现我必须转换它,否则数据实际上会丢失。 最好的方法是什么?
我想我应该对数组进行序列化和反序列化,不幸的是我在这方面经验不足。因此,我们将不胜感激。
PS:我想我应该说我需要在 Android 上这样做,因此使用 SQLite。 string[][] 没有固定的行数或列数。
【问题讨论】:
标签: java android serialization
为什么是blob?为什么不是一团?或者更好的是,为什么不是 varchar?根据您要对数据执行的操作,您应该将数据作为 xml 或 json 存储在 varchar 列中。如有必要,它也可以搜索。
你没有说你的数组中有什么,但可能另一个表适合这个账单,尽管确定这远远超出了这个问题的范围(虽然它会成为一个很好的新问题)。
不,最好将数组序列化为文本并将其存储。
编辑...像JSON-lib 这样的库支持多维数组的双向序列化。只需通过 JSON-lib 运行您的数组以获取 JSON 字符串,存储该字符串,然后当您希望您的数组返回时通过 JSON-lib 运行该字符串。
我更喜欢将我的文本作为文本保存在数据库中,这样我就可以使用众多可用的数据库工具之一来搜索和查看它。我不想运行代码来查看列中的内容,如果我需要在开发过程中手动调整值,我希望能够更新值,而不是运行程序来为我完成。
【讨论】:
好的,假设不会有空值。写出来:
text.getBytes("UTF-8"))您可以在最后一部分只使用DataOutputStream 的writeUTF 方法,但这会使从非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();
}
【讨论】:
我刚刚发现了一个名为 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 太冗长了。
(抱歉拼写错误,我是法国人。)
【讨论】:
您可以使用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);
【讨论】:
我找到了适合我的解决方案。
主要问题是显然 BLOB 没有正确保存在数据库中。我使用 Android 便捷方法更新数据库,现在效果比我最初预期的还要好。
【讨论】: