2010-06-09 3 views
17

Gibt es eine Möglichkeit, ein Array von ganzen Zahlen in einer Spalte der Tabelle zu speichern? Ich möchte o/p wie folgt aus:Wie speichert man Array in einer Spalte in Sqlite3?

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

Das habe ich schon acheieved durch Postgres, aber ich möchte gleiche o/p von SQLite auch. Der Spaltenwert speichert ein Array. Ich habe es über BLOB versucht, aber es funktioniert nicht. Jemand hat mir von einem serialisierten Weg erzählt, aber ich bin mir nicht sicher, wie ich das machen soll.

+1

Sie können die Antwort, die Ihre Frage am besten beantwortet, als akzeptierte Antwort auf Ihre Frage markieren, wenn sie Ihr Problem löst. – starbeamrainbowlabs

Antwort

18

SQLite3 unterstützt Arrays nicht direkt. Siehe here den unterstützten Typ. Im Grunde tut es nur Ints, Floats und Text.

Um zu erreichen, was Sie brauchen, müssen Sie eine benutzerdefinierte Codierung verwenden oder eine FK verwenden, d. H. Eine andere Tabelle erstellen, in der jedes Element im Array als Zeile gespeichert wird.

+1

Und dann importieren Sie sie in die ursprüngliche Tabelle als kein Array? Zum Beispiel haben Sie Seiten referenziert, richtig? Sollte ein Array sein. Und Sie haben eine 'Quelldokument-ID'. Wie korrelieren Sie also die referenzierten Seiten mit der entsprechenden ID des Quelldokuments? Ich denke, dass Sie tatsächlich eine zweite Tabelle haben, die jedes Element im Array gegen den Primärschlüssel der ersten Tabelle speichert, und eine dritte Reihe, um die Beziehungsmenge anzuzeigen, richtig? Kannst du meine Antwort überprüfen? –

1

Dies ist, was ich vorstellen, obwohl es falsch sein kann:

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

Ausgabeformat:

<content> 
    <relationship ID> 
    <unique source document content> 
    <enumerate citation IDs> 
2

Dies ist eine Möglichkeit, Daten von Serialisierung und Deserialisierung:

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

Anstatt Zeit mit der Analyse von Klammern und zusätzlichen Kommas zu verbringen, können Sie als csv serialisieren und beim Prozess zwei nach zwei lesen die deserialisierten Daten.

10

Entschuldigung für Necro Just kann über das Problem selbst und fand eine Lösung.

Da der bereits erwähnte SQLite keine Unterstützung für Arrays hat, können Sie sie nicht als solche speichern. Versuchen Sie dies, ich hatte das gleiche Problem;

Statt Array-Elemente einzeln zu speichern, können Sie sie als große Zeichenfolge verwenden und sie mithilfe der Zeichenfolgenfunktion oder des regulären Ausdrucks in ihre Typen zurückversetzen. einige C# Beispiel

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

} 

dies das Array in einem einzigen String verwandeln, jetzt nehmen wir den String und in der Tabelle als String einfügen, wenn Sie die Zeichenfolge verwenden diesen Code lesen wieder das Array zu erhalten. Ein weiteres C# Beispiel

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

int[] myItems = Array.ConvertAll<string, int>(tokens, int.Parse); 

dies wird nur mit eindimensionalen Arrays arbeiten, Multi-diemnesional kann schwierig bekommen, wenn es um die Saiten Parsen.

+1

Wenn Sie diesen Weg gehen, warum speichern Sie es nicht als JSON-Objekt, da es einfach ist, von JSON zu den meisten Sprachen hin und her zu gehen. – melston