您的位置:首页 > 编程语言 > Qt开发

qt下sqlite数据库的应用(二)

2015-05-27 20:50 363 查看
qt中数据库和窗体界面的交互,可以当后台来用,其中用到的主要控件是tableview,sqlite,所在的环境是linux下,如果是在ios,android下开发,只需要将类的书写方式及动态函数静态函数的书写方式改一下。

在看代码之前想复习一下数据库的知识:

一、数据模型:

定义:现实世界数据特征的抽象,用来定义数据如何组织,数据之间的关系怎样。可分为三层:概念模型、逻辑/实现模型、物理模型

二、三级模式:

1.内模式(存储模式):数据物理结构和存储方式的描述,是数据内部的表示方式。

2.概念模式(全局模式或模式):是对数据库中全体数据的逻辑结构和特征的描述

3.外模式(子模式或用户模式):数据库用户能够看间和使用的局部数据逻辑结构和特征的描述

三、两级映射:

1.概念模式/内模式映射

2.外模式/概念模式

数据的物理独立性:

内模式与模式之间的映射提供了数据的物理独立性。当数据的物理结构发生变化时,只需要修改内模式与模式的映射即可。

数据的逻辑独立性:

模式与外模式之间的映射提供了数据的逻辑独立性。当数据的整体逻辑结构发生变化时,只需要修改各个外模式与模式概念之间的映射即可。

四:数据库系统的设计过程

1.数据设计的基本过程

2.需求收集与分析

3.概念结构设计

4.选择合适的DBMS

5.逻辑结构设计

6.物理结构设计

7.数据库实施

8.运行于维护

举例(SQLITE数据库):

//Database.h

class CDatabase : public QDialog {

Q_OBJECT

public:

CDatabase(QWidget *parent = 0);

~CDatabase();

protected:

void changeEvent(QEvent *e);

private:

Ui::CDatabase *ui;

//add by chenney 注释部分为自己手写

public slots:

void searchSong_clicked();

void upDataSong_clicked();

void clearSong_clicked();

void deleteSong_clicked();

void addSong_clicked(QString str);

void addSong_clicked();

public:

void connectDB();//创建连接函数

void closeDB();//创建关闭函数

int readData(QStandardItemModel *modelSong,QList<Phonon::MediaSource> *list);

private:

QSqlTableModel *model;//建立数据库的文件描述符

QSqlDatabase db;

//add by chenney

};

#endif // CDATABASE_H

//Database.cpp

int num = 0;

CDatabase::CDatabase(QWidget *parent) :

QDialog(parent),

ui(new Ui::CDatabase)

{

ui->setupUi(this);

//add by chenney

//addSong deleteSong searSong clearSong updateSong均为PushButton按钮

connect(ui->addSong,SIGNAL(clicked()),this,SLOT(addSong_clicked()));//添加数据

connect(ui->deleteSong,SIGNAL(clicked()),this,SLOT(deleteSong_clicked()));//删除数据

connect(ui->searSong,SIGNAL(clicked()),this,SLOT(searSong_clicked()));//查找数据

connect(ui->clearSong,SIGNAL(clicked()),this,SLOT(clearSong_clicked()));//清空数据库

connect(ui->updateSong,SIGNAL(clicked()),this,SLOT(updateSong_clicked()));//更新数据库

connectDB();

//绑定数据库到tableview列表

model = new QSqlTableModel(this);

model->setTable("music");//数据库名字music

model->setEditStrategy(QSqlTableModel::OnManualSubmit);

model->select();//选取标的一行

ui->songList->setModel(model);

ui->songList->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:transparent;}");

//add by chenney

}

CDatabase::~CDatabase()

{

delete ui;

}

void CDatabase::changeEvent(QEvent *e)

{

QDialog::changeEvent(e);

switch (e->type()) {

case QEvent::LanguageChange:

ui->retranslateUi(this);

break;

default:

break;

}

}

//add by cheny

void CDatabase::connectDB()

{

db = QSqlDatabase::addDatabase("QSQLITE");//链接数据库

db.setDatabaseName("music.db");

if(!db.open())//打开数据库

{

qDebug()<< "database is error";

}

else

{

qDebug()<<"database is ok";

}

QSqlQuery quer;

quer.exec(QObject::tr("create table music (music string)"));//创建表格

}

void CDatabase::closeDB()

{

db.close();//关闭数据库

}

/*添加歌曲*/

void CDatabase::addSong_clicked(QString str)

{

QSqlQuery quer;

quer.prepare("INSERT INTO music(music) VALUES(:music)");

quer.bindValue(":music",str);

quer.exec();

model->submitAll();

}

/*删除歌曲*/

void CDatabase::deleteSong_clicked()

{

int curRow = ui->songList->currentIndex().row();

model->removeRow(curRow);

int ok = QMessageBox::warning(this,tr("delete the current row !"),tr("Are you sure delete the current row ?"),QMessageBox::Yes,QMessageBox::No);

if(ok == QMessageBox::No)

{

model->revertAll();

}

else

{

model->submitAll();

num--;

}

}

/*清空数据库*/

void CDatabase::clearSong_clicked()

{

int ok = QMessageBox::warning(this,tr("clear the List !"),tr("Are you sure clear the List ?"),QMessageBox::Yes,QMessageBox::No);

if(ok == QMessageBox::No)

{

model->revertAll();

}

else

{

QMessageBox(this,"Error info ","clear failed");

}

}

/*更新数据库*/

void CDatabase::upDataSong_clicked()

{

ui->songList->setModel(model);

}

void CDatabase::searchSong_clicked()

{

QString music = ui->editSong->text();

model->setFilter(QObject::tr("music = '%1'").arg(music));//setFilter()函数进行关键字筛选

model->select();

}

/*读取数据到列表(此列表是在另个窗体上,单单数据库可以不用这个)*/

int CDatabase::readData(QStandardItemModel *modelSong, QList<Phonon::MediaSource> *list)

{

int k = 0;

QSqlQuery quer;

quer.exec("select * from music");

while(quer.next())

{

list->append(quer.value(0).toString());

modelSong->setItem(k,0,new QStandardItem(QFileInfo(quer.value(0).toString()).fileName()));

k++;

}

return k;

}

/*添加数据到tableview列表*/

void CDatabase::addSong_clicked()

{

QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play"),"/","*.wav *mp3");

QString file;

QSqlQuery quer;

foreach(file, files)

{

quer.prepare("INSERT INTO music(music) VALUES(:music)");

quer.bindValue(":music",file);

quer.exec();

}

model->submitAll();//提交数据。

}

//add by chenney
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: