Während der Laufzeit die SQLite DB wechseln

Alles rund um die Programmierung mit Qt
Antworten
Strayer
Beiträge: 12
Registriert: 11. November 2008 19:16

Während der Laufzeit die SQLite DB wechseln

Beitrag von Strayer »

Hi,

ich arbeite an einem Programm mit zwei Model/View-Komponenten die auf eine SQLite Datenbank zugreifen.

Ich möchte nun während der Laufzeit die Datenbank wechseln. Das ganze klappt auch, nur wird die "alte" SQLite Datenbank nicht geschlossen.
Hier ist der Code der die Datenbank öffnet:

Code: Alles auswählen

bool DataHandler::openDatabase(QString file, bool removeBeforeOpen)
{
	// Ggfs. alte DB schließen
	if (QSqlDatabase::contains(QSqlDatabase::defaultConnection))
	{
		QSqlDatabase::database().close();
		QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);
	}

	// Angegebene Datei löschen
	if (removeBeforeOpen && QFile::exists(file))
		qDebug() << QFile::remove(file);
	
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName(file);

	if (!db.open())
	{
		QMessageBox::critical(0, QObject::tr("Datenbankfehler!"),
			db.lastError().text());
		return false;
	}

	createWeekEntriesMapping();

	return true;
}
Wie man dort schon sieht möchte ich auch die aktuelle Datenbank überschreiben können.
Ich dachte es würde reichen wenn ich die aktuelle DB schließe, die Datei lösche und neu öffne, aber das ganze klappt leider nicht.

removeDatabase erzeugt diese Warnung:

Code: Alles auswählen

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Die Dateihandles werden auch nicht geschlossen. (habe ich mit Unlocker überprüft)
Wenn ich die Model/View-Komponenten nicht erstelle klappt alles einwandfrei.

Mein Gedanke wäre gewesen, die Models vor dem schließen der Datenbank von den Views zu entbinden und mit delete zu löschen, aber sowas geht wohl nicht...

Wie kann ich dieses Problem lösen?

Danke schonmal,
Strayer
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Solange noch ein QSqlQuery drauf zugreift geht es nicht - bleibt also nur die QSqlQueryModels zu löschen indem man z.B. ein leeres Model setzt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten