Доброго времени суток!
Имею следующий код при работе с SQLITE:
void writedb::writeMyLibraryMaterials(const QString myFileName, const QMap<int,QStringList> LibraryMaterials,
const QMap<int,QString> LibraryCategory)
{
QSqlDatabase db = QSqlDatabase::database("myLibraryMaterialConnect",false);
db.setDatabaseName(myFileName);
if (!db.open())
{
QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Ошибка при подключении к базе данных %1.").arg(myFileName));
return;
}
QSqlQuery query(db);
query.exec("DELETE FROM LibraryMaterials;");
query.exec("DELETE FROM LibraryCategory;");
QString strF;
QString str;
QStringList current;
QString arg[13];
QMap<int,QStringList>::const_iterator it=LibraryMaterials.begin();
while (it != LibraryMaterials.end())
{
current = it.value();
for (int i = 0; i < current.size(); ++i)
arg[i]=current.at(i);
strF = "INSERT INTO LibraryMaterials ("
"number, category, name, colorreg, colorgreen, colorblue, material,"
"text1, text2, scalex, scaley, repeatex, repeatey, autorepeat) "
"VALUES('%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10', '%11', '%12', '%13', '%14');";
str = strF.arg(it.key()) //номер материала
.arg(arg[0].toInt()) //номер категории
.arg(arg[1]) //имя материала
.arg(arg[2].toInt()) //R
.arg(arg[3].toInt()) //G
.arg(arg[4].toInt()) //B
.arg(arg[5].toInt()) //номер базового материала
.arg(arg[6]) //файл текстуры 1
.arg(arg[7]) //файл текстуры 2
.arg(arg[8].toDouble())
.arg(arg[9].toDouble())
.arg(arg[10].toDouble())
.arg(arg[11].toDouble())
.arg(arg[12].toInt());
if (!query.exec(str))
QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Не смогли записать данные в таблицу библиотечных материалов."));
++it;
}
QMap<int,QString>::const_iterator itCat=LibraryCategory.begin();
while (itCat != LibraryCategory.end())
{
strF = "INSERT INTO LibraryCategory ("
"number, name) "
"VALUES('%1', '%2');";
str = strF.arg(itCat.key()).arg(itCat.value());
if (!query.exec(str))
QMessageBox::warning(0, trUtf8("Ошибка"), trUtf8("Не смогли записать категории материалов."));
++itCat;
}
if (db.isOpen()) db.close();
}
Все работает, все здорово, но только после выполнения пары тысяч строк, происходит бурная работа на жестком диске.
Т.е. насколько я понимаю, при выполнении любого SQL запроса, qt записывает базу данных на диск. А в связи с тем что таких запросов несколько тысяч то и записывает он множество раз.
Так вот, хотел спросить, что в этой ситуации можно улучшить. Записать файл сначала в память, а потом уже на диск, как вариант создать раздел в памяти или все таки есть более простой способ ???
Спасибо заранее за помощь !