Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > SQLITE+QSqlTableModel+QTableView как шифровать БД


Автор: Alca 31.10.2011, 16:16
Qt 4.7.3

Использую SQLITE + QSqlTableModel + QTableView. 
Как осуществить шифрование БД? 
Т.е. чтоб при вставке данные шифровались, а при выборке расшифровывались?

Автор: borisbn 31.10.2011, 17:06
Если с чтением более или менее понятно - наследоваться от QSqlTableModel, переписать ф-цию data, вызвать в ней QSqlTableModel::data, полученные данные расшифровать и вернуть - то с записью - не очень. Как у тебя производится запись в БД ?

Автор: Alca 31.10.2011, 18:02
Цитата

Как у тебя производится запись в БД ?

Код

model->setEditStrategy(QSqlTableModel::OnFieldChange);



Вот весь код:
Код

#ifndef CMAIN_H
#define CMAIN_H
//---------------------------------------------------------------------------
#include <QtGui/QWidget>
#include <QtGui/QMessageBox>
#include <QtSql>
#include <QImage>

#include "ui_CMain.h"
//---------------------------------------------------------------------------
class CMain :
    public QWidget
{
        Q_OBJECT

    public:
        CMain(QWidget *parent = 0);
        ~CMain();

    private:
        Ui::CMainClass  ui;

        QSqlTableModel *model;

        QSqlDatabase    _m_dbDatabse;

        void            setupModel();
};
//---------------------------------------------------------------------------
#endif // CMAIN_H


Код

#include "CMain.h"
//---------------------------------------------------------------------------
CMain::CMain(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    setupModel();

    QImage imgPhoto;
    imgPhoto.load("./image.png");

    QImage img1 = imgPhoto.scaled(QSize(120 * 2, 90 * 2), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

    ui.lblPhoto->setPixmap(QPixmap::fromImage(img1));
    //ui.lblPhoto->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
//---------------------------------------------------------------------------
CMain::~CMain()
{
    _m_dbDatabse.close();
}
//---------------------------------------------------------------------------
void
CMain::setupModel() {
    bool bRes = false;

    _m_dbDatabse = QSqlDatabase::addDatabase("QSQLITE");

    _m_dbDatabse.setDatabaseName("./base.db");
    if (!_m_dbDatabse.open()) {
        QMessageBox::critical(0, tr(""), tr("Unable to establish a database connection."), QMessageBox::Cancel);
        return;
    }

    //Set up the main table
    QSqlQuery query;

    bRes = query.exec("CREATE TABLE T_PERSON (F_ID INT PRIMARY KEY, F_NAME VARCHAR(20), F_ADGE INT)");
    if (false == bRes) {
        //QMessageBox::critical(0, tr(""), tr("Can't create table."), QMessageBox::Cancel);
    }

    bRes = query.exec("INSERT INTO T_PERSON VALUES(1, 'Alice',  20)");
    if (false == bRes) {
        //QMessageBox::critical(0, tr(""), tr("Can't insert record."), QMessageBox::Cancel);
    }

    bRes = query.exec("INSERT INTO T_PERSON VALUES(2, 'Bob',    30)");
    bRes = query.exec("INSERT INTO T_PERSON VALUES(3, 'Carol',  19)");
    bRes = query.exec("INSERT INTO T_PERSON VALUES(4, 'Donald', 40)");
    bRes = query.exec("INSERT INTO T_PERSON VALUES(5, 'Emma',   25)");

    //QSqlTableModel
    model = new QSqlTableModel(this, _m_dbDatabse);
    model->setTable("T_PERSON");
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->select();
    //model->removeColumn(0); // don't show the ID

    model->setHeaderData(0, Qt::Horizontal, tr("Id"));
    model->setHeaderData(1, Qt::Horizontal, tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, tr("Address"));

    ui.tabvInfo->setModel(model);
    ui.tabvInfo->show();

    model->select();
}
//---------------------------------------------------------------------------


Автор: borisbn 31.10.2011, 22:28
С записью может помочь http://doc.qt.nokia.com/latest/qsqltablemodel.html#beforeUpdate
как видишь ссылка там не константная

Автор: Alca 1.11.2011, 21:59
Сделал через  QSqlTableModel::data + QSqlTableModel::setData.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)