Treeview in und aus SQLite Datenbank
-
Hallo ich habe ein Problem mit der Datenstruktur einer Datenbank.
Ein und Auslesen in die Datenbank geht.
Ich lade die gesamte Struktur am Anfang und speichere sie am Ende.
Es werden aber immer mehr Datensätze und das Speichern dauert immer länger.Jetzt möchte ich nur immer einen Datensatz speicher.
Dieser ist am Ende der Datenbank und wird somit auch ans Ende des
Treeviews gehängt. (also falsche Position).
Wie löst ihr dieses Problem.
(ich brauche sicher noch ein Datenfeld mit eindeutiger Zuweisung).Speichern:
sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("db.db",&db); String name1; String zhelp1; String zchil; String zpar; String tmp1; TTreeNode *Node1; Node1 = TreeView1->Items->GetFirstNode(); for (int i=0;i<TreeView1->Items->Count;i++) { zchil = "0"; name1 = TreeView1->Items->Item[i]->Text; TreeView1->Items->Item[i]->Selected = true; TreeView1->SetFocus(); if(Node1->Parent) { zpar = Node1->Parent->Level; } else { zpar = -1; } zchil = Node1->Level; tmp1 = "\""; String tmp1 = "\""; String& query = ""; query = "INSERT OR REPLACE INTO T1 (name1,zpar ,zchil) VALUES("; query = query + tmp1 + name1 + tmp1; query = query + "," + tmp1 + zpar + tmp1 ; query = query + "," + tmp1 + zchil + tmp1 ; query = query + ");"; AnsiString AString = query; char * buffer = AString.c_str (); rc = sqlite3_exec(db, buffer, callback, 0, &zErrMsg); if( rc!=SQLITE_OK ) { tmp1 = zErrMsg; sqlite3_free(zErrMsg); } Node1 = Node1->GetNext(); }
Laden:
TreeView1->Items->Clear(); char *zErrMsg = 0; int rc; rc = sqlite3_open("db.db",&db); AnsiString AString = "SELECT * FROM T1;"; char * buffer = AString.c_str (); const char *Bez0; const char *Bez2; String tmpBez0; sqlite3_stmt *statement; int Pos1; int zpar; int zchil; TTreeNode *Node1; ii = 0; if (sqlite3_prepare_v2(db,buffer, -1, &statement, 0)==SQLITE_OK) { while(sqlite3_step(statement)==SQLITE_ROW) { Bez0 = (const char*)sqlite3_column_text(statement, 0); zpar = sqlite3_column_int(statement, 1); zchil = sqlite3_column_int(statement, 2); tmpBez0 = Bez0; PMyRec MyRecPtr; MyRecPtr = new TMyRec; MyRecPtr->sTest = Bez0; MyRecPtr->iAnz = zpar; MyRecPtr->iiAnz = zchil; if(zpar == -1) { Node1 = F1->TreeView1->Items->AddObject(NULL, tmpBez0,MyRecPtr); } else { if(pNode) { if(pNode->Level == zchil) { Node1 = F1->TreeView1->Items->AddChildObject(pNode->Parent,tmpBez0,MyRecPtr); } else { if(pNode->Level > zchil) { while((pNode->Level > zchil) && (pNode != NULL)) { pNode = pNode->GetPrev(); } Node1 = F1->TreeView1->Items->AddObject(pNode,tmpBez0,MyRecPtr); } else { Node1 = F1->TreeView1->Items->AddChildObject(pNode,tmpBez0,MyRecPtr); } } } } pNode = Node1; F1->ii++; } sqlite3_finalize(statement); }
Einen Knoten einfügen:
int lev; int rc; sqlite3 *db; rc = sqlite3_open("db.db",&db); char *zErrMsg = 0; PMyRec MyRecPtr; MyRecPtr = new TMyRec; if (TreeView1->Items->Count < 1) //erster Knoten wenn noch leer { TreeView1->Items->AddObject(TreeView1->Selected, "Neuer Ordner", MyRecPtr); lev = 0; lev = TreeView1->Selected->AbsoluteIndex; } else { TreeView1->Items->AddObject(TreeView1->Selected, "Neuer Ordner", MyRecPtr); } String zchil; String name1; String zpar; name1 = "Neuer Ordner"; int Pos2; TTreeNode *Node1; Node1 = TreeView1->Selected; TreeView1->SetFocus(); if(Node1->Parent) { zpar = Node1->Parent->Level; } else { zpar = -1; } zchil = Node1->Level; tmp1 = "\""; String tmp1 = "\""; String& query = ""; query = "INSERT OR REPLACE INTO T1 (name1,zpar ,zchil) VALUES("; query = query + tmp1 + name1 + tmp1; query = query + "," + tmp1 + zpar + tmp1 ; query = query + "," + tmp1 + zchil + tmp1 ; query = query + ");"; AnsiString AString = query; char * buffer = AString.c_str (); rc = sqlite3_exec(db, buffer, callback, 0, &zErrMsg); if( rc!=SQLITE_OK ) { tmp1 = zErrMsg; sqlite3_free(zErrMsg); }
Vielen Dank
/edit akari : Bitte Code-Tags verwenden! sfds
-
Mal ein paar Tips...
* du könntest das Treeview nicht direkt mit einem nativen DB-Cursor (sqlite3_exec ...) befüllen sondern eine entsprechende DBExpress- o.ä. Komponente dazwischenschalten welche die Daten lädt und nur die geänderten Datensätze (statt allen) zurückschreibt. Wieweit in diesen Systemen sqllite unterstützt wird weiß ich nicht.
Das mit "Am Ende der DB einfügen" verstehe ich nicht. Was meinst du damit?