web-dev-qa-db-fra.com

Comment stocker le tableau dans une colonne dans Sqlite3?

Existe-t-il un moyen de stocker un tableau d'entiers dans une colonne de table? Je veux o/p comme ceci:

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

J'ai déjà réussi cela par le biais de postgres mais je veux aussi le même o/p de sqlite. Ici, la valeur de la colonne stocke un tableau. Je l'ai essayé via BLOB mais cela ne fonctionne pas. Quelqu'un m'a parlé de la manière sérialisée mais je ne sais pas comment faire ça.

27
SPK

SQLite3 ne prend pas directement en charge les tableaux. Voir ici le type qu'il prend en charge. Fondamentalement, il ne fait que Ints, Floats et Text.

Pour accomplir ce dont vous avez besoin, vous devez utiliser un encodage personnalisé ou utiliser un FK, c'est-à-dire créer une autre table, où chaque élément du tableau est stocké sous forme de ligne.

23
Gianni

C'est une façon de sérialiser et de désérialiser les données:

#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;
}

Au lieu de passer du temps à analyser les parenthèses et les virgules supplémentaires, vous pouvez sérialiser en tant que csv et lire deux par deux lors du traitement des données désérialisées.

2
nurettin

C'est ce que j'envisage, bien qu'il puisse être incorrect:

<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)
    )

Format de sortie:

<content>
  <relationship ID>
  <unique source document content>
  <enumerate citation IDs>
1
Wolfpack'08