Просмотр результирующего набора выполняется путем получения заданной записи функцией QSqlTableModel::record() и доступа к отдельным полям с помощью функции value():

for (int i = 0; i < model.rowCount(); ++i) {

QSqlRecord record = model.record(i);

QString title = record.value("title").toString();

int year = record.value("year").toInt();

cerr << qPrintable(title) << ": " << year << endl;

}

Функция QSqlRecord::value() принимает либо имя поля, либо индекс поля. При работе с большими наборами данных рекомендуется задавать поля с помощью их индексов. Например:

int titleIndex = model.record().indexOf("title");

int yearIndex = model.record().indexOf("year");

for (int i = 0; i < model.rowCount(); ++i) {

QSqlRecord record = model.record(i);

QString title = record.value(titleIndex).toString();

int year = record.value(yearIndex).toInt();

cerr << qPrintable(title) << ": " << year << endl;

}

Для вставки записи в таблицу базы данных мы действуем так же, как если бы делали вставку в двумерную модель: сначала вызываем функцию insertRow() для создания новой пустой строки (записи) и затем используем setData() для установки значения каждого столбца (поля записи).

QSqlTableModel model;

model.setTable("cd");

int row = 0;

model.insertRows(row, 1);

model.setData(model.index(row, 0), 113);

model.setData(model.index(row, 1), "Shanghai My Heart");

model.setData(model.index(row, 2), 224);

model.setData(model.index(row, 3), 2003);

model.submitAll();

После вызова submitAll() запись может быть перемещена в другую позицию, зависящую от упорядоченности таблицы. Вызов submitAll() возвратит false, если вставка окажется неудачной.

Важным отличием модели SQL от стандартной модели является необходимость вызова в модели SQL функции submitAll() для записи всех изменений в базу данных

Для обновления записи мы должны сначала установить QSqlTableModel на запись, которую мы хотим модифицировать (например, используя функции select()). Затем мы извлекаем запись, обновляем соответствующие поля и записываем наши изменения обратно в базу данных:

QSqlTableModel model;

model.setTable("cd");

model.setFilter("id = 125");

model.select();

if (model.rowCount() == 1) {

QSqlRecord record = model.record(0);

record.setValue("title", "Melody A.M.");

record.setValue("year", record.value("year").toInt() + 1);

model.setRecord(0, record);

model.submitAll();

}

Если имеется запись, удовлетворяющая заданному фильтру, доступ к ней мы получаем при помощи функции QSqlTableModel::record(). Мы осуществляем наши изменения и вновь записываем в базу данных запись с новыми значениями полей.

Кроме того, обновление можно выполнить при помощи функции setData(), как это делается для модели, отличной от SQL—модели. Для получения доступа к полям записи используются индексы модели с указанием номера строки (записи) и столбца (поля):

model.select();

if (model.rowCount() == 1) {

model.setData(model.index(0, 1), "Melody A.M.");

model.setData(model.index(0, 3),

model.data(model.index(0, 3)).toInt() + 1);

model.submitAll();

}

Удаление записи напоминает ее обновление:

model.setTable("cd");

model.setFilter("id = 125");

model.select();

if (model.rowCount() == 1) {

model.removeRows(0, 1);

model.submitAll();

}

В вызове removeRows() указываются номер строки первой удаляемой записи и количество удаляемых записей. В следующем примере удаляются все записи, удовлетворяющие фильтру:

model.setTable("cd");

model.setFilter("year < 1990");

Перейти на страницу:

Похожие книги