Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Как очистить базу данных?

Автор: RazrFalcon 24.4.2011, 21:13

У меня DB используется в качестве table cached.
Иногда, мне нужно или ее вообще удалить или очистить полностью.
А у меня, новые данные просто в конец дописываются.
Пробовал так:

QSqlQuery query;
query.prepare("DELETE * FROM tags");
query.exec();
//так
db->removeDatabase("my.db");
//так
db->close();
//так
QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

Автор: silver47 25.4.2011, 20:08

я бы или таблицы все вычистил или бы файл с БД удалил. Кстати в DELETE FROM никогда не указываются поля т.е. DELETE FROM tags

Автор: RazrFalcon 25.4.2011, 22:32

Цитата(silver47 @ 25.4.2011, 20:08) *
я бы или таблицы все вычистил или бы файл с БД удалил.

Как?
Можно пример?
Я с базами работаю 2-а дня.

Автор: Litkevich Yuriy 26.4.2011, 5:58

Цитата(RazrFalcon @ 26.4.2011, 1:32) *
Как?
файл удали

Автор: silver47 26.4.2011, 6:42

Если таблиц мало (да даже если и много) то лучше их вычистить:

QSqlQuery query(cacheDB);
query.exec("DELETE FROM [tablename1]");
...
query.exec("DELETE FROM [tablenamen]");


Можно удалить файл, но тогда структуру БД придется пересоздать заново:
cacheDB.close();
QFile dbFile(cacheDB.databaseName());
if(dbFile.remove()) qDebug() << "База данных была!!!";

// теперь заново открываем БД, это приведет к созданию пустой БД, таблицы придется создавать заново
if(!cacheDB.open()) {
    qDebug() << "Ошибка при открытии базы данных: " << cacheDB.lastError().text();
    return;
}

query.exec("CREATE TEBLE [tablename1] (.....)");

Автор: RazrFalcon 26.4.2011, 10:33

Цитата
файл удали
Это ясно. А если в оперативке база?

Цитата
QSqlQuery query;
query.exec("DELETE FROM [tablename1]");
После этого нужно снова делать:
model = new QSqlTableModel(this);
model->setTable("tags");
model->select();
table->setModel(model);
Или нет?

Автор: silver47 26.4.2011, 10:47

достаточно model->select();

С оперативкой еще проще, mainDB.close(); mainDB.open();

Автор: RazrFalcon 26.4.2011, 13:01

Спасибо. Теперь работает как надо.

Автор: RazrFalcon 26.4.2011, 20:30

После эксперементов снова слетело.
Мне нужно создать базу, 1-н раз.
Затем мы ее заполняем и выводим в QTableView.
Затем нужно ее очистить, структура должна остатся.
И снова заполнить.
Делаю так:

//создаю в MainWindow::MainWindow(...)
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");

//в функции заполнения
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query(db);
//... заполнение

//функция очистки
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query(db);
query.exec("DELETE FROM tags");

В итоге получаю дублирования. Все строки по 2-а раза в таблице. Что не так?

Автор: RazrFalcon 26.4.2011, 22:37

Решено!
Я зыбыл очищять QFileInfoList :rolleyes:

Автор: mezmay 27.4.2011, 8:29

RazrFalcon а конечный вариант показать можешь?

Автор: RazrFalcon 27.4.2011, 14:23

bool dbCreated=false; //так как мне не нужно ее снова создавать

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
  setupUi(this);

  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName(":memory:");
  //... остальной код
}

void MainWindow::addToSQL()
{
  QSqlDatabase db = QSqlDatabase::database();
  QSqlQuery query(db);
  QFileInfoList files = *selectedFilesInfoList;

  if (!dbCreated) {
    query.exec("create table tags (title text, "
                                  "artist text, "
                                  "album text)");
    dbCreated=true;
  }
  for (int i=0; i<files.count(); i++) {
    query.prepare("INSERT INTO tags VALUES "
                  "(:title, :artist, :album)");
    query.bindValue(":title", QS(tag->title()));
    query.bindValue(":artist", QS(tag->artist()));
    query.bindValue(":album", QS(tag->album()));
    query.exec();
  }
  model = new QSqlTableModel(this);
  model->setTable("tags");
  model->select();
  table->setModel(model);
  table->resizeColumnsToContents();
}

void MainWindow::on_actionClose_triggered() {
  QSqlDatabase db = QSqlDatabase::database();
  QSqlQuery query;
  query.exec("DELETE FROM tags");
  model->select();
}

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)