如何在Sqlite3中的一列中存储数组?

SPK*_*SPK 29 c++ sqlite

有没有办法在一列表中存储整数数组?我想这样的o/p:

ident | value                                                            | count 
----------------+------------------------------------------------------------------------------------------------------------------------+-------
563 | [0:10]={"(0,0)","(1,100)","(2,200)","(3,300)","(4,400)","(5,500)"} |    6
Run Code Online (Sandbox Code Playgroud)

这个我已经通过postgres得到了解,但我也希望从sqlite获得相同的o/p.这里列值存储一个数组.我通过BLOB尝试了它,但它无法正常工作.有人告诉我关于序列化的方式,但我不知道该怎么做.

Eri*_*sty 32

自 3.38 版本以来,Sqlite 现在原生支持 json_object() 数据类型:

您可以将数组存储在 JSON 字段中、查询它们并为其建立索引。更多信息在这里: https: //www.sqlite.org/json1.html

例如,询问哪些客人喜欢橙子:

create table guests (name, likes);
insert into guests values ('bob', json('["apples", "oranges"]'));
insert into guests values ('alice', json('["oranges", "pears"]'));
insert into guests values ('carol', json('["apples", "pears"]'));
select name from guests, json_each(likes) where json_each.value='oranges';
Run Code Online (Sandbox Code Playgroud)

您可以在这里尝试一下: https://sqlime.org/#deta:m97q76wmvzvd


Gia*_*nni 23

SQLite3不直接支持数组.见这里支持的类型.基本上,它只有Ints,Floats和Text.

要完成您的需要,您必须使用自定义编码,或使用FK,即创建另一个表,其中数组中的每个项目都存储为一行.

  • 然后将它们作为数组而不是导入到原始表中?例如,您有“参考页面”,对吧?应该是一个数组。并且您有“源文档 ID”。那么,如何将引用的页面与适当的源文档 ID 相关联?我认为您实际上有第二个表,它根据第一个表的主键存储数组中的每个项目,第三行表示关系集,对吧?你能检查一下我的答案吗? (4认同)

For*_*000 14

对不起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();

}
Run Code Online (Sandbox Code Playgroud)

这会将数组转换为单个字符串,现在我们将字符串作为字符串插入表中,当您读取字符串时,使用此代码将数组返回.另一个C#例子

string value; //assign this via Reader
string[] tokens = values.Split(',');

int[] myItems = Array.ConvertAll<string, int>(tokens, int.Parse);
Run Code Online (Sandbox Code Playgroud)

这只适用于单维数组,在解析字符串时多维可能会变得棘手.

  • 如果你要使用这条路线,为什么不将它存储为json对象,因为它很容易从json到大多数语言来回传递. (7认同)
  • 如果您可以承受错失结构化查询,那么将对象序列化为字符串以存储在 SQLite 数据库中是可以的。 (4认同)

Jul*_*ian 6

您可以使用 JSON.stringify,当您再次读入数据时可以使用 JSON.parse。因此,您将数组存储为字符串,并且可以轻松地将其再次解析回数组。这样你也可以将数组的数组放入sqlite数据库中