有没有办法在一列表中存储整数数组?我想这样的o / p:
ident | value | count
----------------+------------------------------------------------------------------------------------------------------------------------+-------
563 | [0:10]={"(0,0)","(1,100)","(2,200)","(3,300)","(4,400)","(5,500)"} | 6
我已经通过postgres实现了这个,但我也希望从sqlite获得相同的o / p。 这里列值存储一个数组。我通过BLOB尝试了它,但它无法正常工作。有人告诉我关于序列化方式,但我不知道该怎么做。
答案 0 :(得分:20)
SQLite3不直接支持数组。请参阅here它支持的类型。基本上,它只有Ints,Floats和Text。
要完成您的需要,您必须使用自定义编码,或使用FK,即创建另一个表,其中数组中的每个项目都存储为一行。
答案 1 :(得分:12)
很抱歉Necro,我自己遇到了问题并找到了解决方案。
如前所述,SQLite不支持数组,因此您无法存储它们。 试试这个,我有同样的问题;
您可以将它们存储为大字符串,并使用字符串函数或正则表达式将它们解析回其类型,而不是单独存储数组元素。 C#示例
int[] myArray = new int[] {8,4,345,378,34456,7};
string Arraystring = myArray[0].ToString();
for(int i = 1; i < myArray.Length; i++) {
Arraystring += "," + myArray[i].ToString();
}
这会将数组转换为单个字符串, 现在我们取字符串并将其作为字符串插入表中,当您读取字符串时,使用此代码将数组返回。另一个C#示例
string value; //assign this via Reader
string[] tokens = values.Split(',');
int[] myItems = Array.ConvertAll<string, int>(tokens, int.Parse);
这只适用于单维数组,在解析字符串时多维可能会变得棘手。
答案 2 :(得分:2)
这是序列化和反序列化数据的一种方法:
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
std::vector<std::string> deserialize_array(std::string const &csv)
{
std::istringstream parse(csv);
std::vector<std::string> ret;
for(std::string token; std::getline(parse, token, ','); ret.push_back(token));
return ret;
}
std::string serialize_array(std::string* array_ptr, std::size_t N)
{
std::ostringstream cat;
for(std::size_t index= 0; index< N; ++ index)
cat<< array_ptr[index]<< ',';
std::string ret= cat.str();
return ret.substr(0, ret.size()-1);
}
int main()
{
std::string data= "1,2,3";
std::cout<< "Data: "<< data<< std::endl;
std::vector<std::string> deserialized= deserialize_array(data);
std::string serialized= serialize_array(deserialized.data(), deserialized.size());
std::cout<< "Serialized + Deserialized: "<< serialized<< std::endl;
}
在处理反序列化数据时,您可以将序列化为csv而不是花时间解析括号和额外逗号。
答案 3 :(得分:1)
这是我想象的,虽然它可能不正确:
<table>
<citation>
<citation ID>
<citation content>
<citation publication date>
CREATE TABLE citation
(
citation_ID INTEGER PRIMARY KEY AUTOINCREMENT,
citation VARCHAR(255)
published datetime
)
<table>
<source doc>
<source doc ID>
<source doc content>
CREATE TABLE source
(
source_ID INTEGER PRIMARY KEY AUTOINCREMENT,
source VARCHAR(5000)
)
<citation_to_source table> //table in question
<relationship>
<relationship ID>
<citation ID>
<source doc ID>
CREATE TABLE citation_to_source //table in question
(
relationship_id INTEGER,
citation_ID INTEGER,
source_ID INTEGER,
FOREIGN KEY(citation_ID) REFERENCES citation(citation_ID)
FOREIGN KEY(source_ID) REFERENCES source(source_ID)
)
输出格式:
<content>
<relationship ID>
<unique source document content>
<enumerate citation IDs>