问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

qt怎么连接已经存在的sqlite3数据库

发布网友 发布时间:2022-04-08 04:57

我来回答

2个回答

懂视网 时间:2022-04-08 09:18

#include <QtWidgets/QApplication> #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QtCore/QDir> #include <QMessageBox> bool createdb(); int main(int argc, char *argv[]) { QApplication a(argc, argv); createdb(); mysql w; w.show(); return a.exec(); } bool createdb() { bool bret = false; //这里创建一个db目录存储数据库文件 QString strdbpath(""); strdbpath = QCoreApplication::applicationDirPath(); strdbpath += "/db"; QDir dir(""); dir.mkpath(strdbpath); strdbpath += "/mysqlite.db"; QSqlDatabase dbset = QSqlDatabase::addDatabase("QSQLITE", "file"); dbset.setDatabaseName(strdbpath); if (!dbset.open()) { //LOG_ALL_ERROR(QStringLiteral("failed open mysqlite.db")); return bret; } QSqlQuery setquery(QSqlDatabase::database("file", true)); if(!setquery.exec("PRAGMA foreign_keys = ON;")) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); QMessageBox::information(nullptr, "errormsg", texterr); return false; } //商品详情表 bret = setquery.exec("create table tb_goods(rfid varchar(33) primary key, name varchar(200) not null)"); if (!bret) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); if (texterr.contains("already exists", Qt::CaseInsensitive)) bret = true; else { //LOG_ALL_ERROR(QStringLiteral("failed create table tb_goods.")); return bret; } } //这里条码对照表和skuid对照表因为可能牵涉到多对多的情况 故没有作为主键 //条码对照表 bret = setquery.exec("create table tb_barcode(id INTEGER PRIMARY KEY AUTOINCREMENT, " "barcode varchar(100) not null, rfid varchar(33) not null, " "FOREIGN KEY(rfid) REFERENCES tb_goods(rfid) ON DELETE cascade)"); if (!bret) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); if (texterr.contains("already exists", Qt::CaseInsensitive)) bret = true; else { return bret; } } return bret; }
mysql.h
#ifndef MYSQL_H
#define MYSQL_H

#include <QtWidgets/QMainWindow>
#include <QSqlQueryModel>
#include "ui_mysql.h"

class mysql : public QMainWindow
{
 Q_OBJECT

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

private slots:
 void on_insertButton_clicked();
 void on_deleteButton_clicked();
 void on_updateButton_clicked();

private:
 void reflushModel();
 void setAttibutes(QTableView* pView, int nHeaderHeight = 45, int nColumnHeight = 45);

private:
 Ui::mysqlClass ui;
 QSqlQueryModel m_goodsmodel;
 QSqlQueryModel m_barcodemodel;
};

#endif // MYSQL_H
mysql.cpp
#include "mysql.h"
#include <QSqlError>
#include <QSqlQuery>
#include <QScrollBar>

mysql::mysql(QWidget *parent)
 : QMainWindow(parent)
{
 ui.setupUi(this);

 m_goodsmodel.setQuery("select * from tb_goods", QSqlDatabase::database("file", true));
 m_goodsmodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("id"));
 m_goodsmodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("名称"));

 m_barcodemodel.setQuery("select * from tb_barcode", QSqlDatabase::database("file", true));
 m_barcodemodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("id"));
 m_barcodemodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("扫描码"));
 m_barcodemodel.setHeaderData(2, Qt::Horizontal, QStringLiteral("rfid"));

 ui.goodView->setModel(&m_goodsmodel);
 ui.skuidView->setModel(&m_barcodemodel);
 setAttibutes(ui.goodView);
 setAttibutes(ui.skuidView);
}

mysql::~mysql()
{
}

void mysql::on_insertButton_clicked()
{
 QSqlQuery setquery(QSqlDatabase::database("file", true));
 setquery.exec("insert into tb_goods values(‘123456789‘, ‘aaa‘)");
 setquery.exec("insert into tb_goods values(‘23456789‘, ‘aaeffdda‘)");

 setquery.exec("insert into tb_barcode(barcode,rfid) values(‘adddaeee‘, ‘123456789‘)");
 reflushModel();
}

//这里应该问题不是很大
void mysql::on_deleteButton_clicked()
{
 QSqlQuery setquery(QSqlDatabase::database("file", true));
 setquery.exec("delete from tb_goods where rfid=‘123456789‘");
 reflushModel();
}

void mysql::on_updateButton_clicked()
{
 QSqlQuery setquery(QSqlDatabase::database("file", true));
 setquery.exec("update tb_goods set name=‘redddd‘ where rfid=‘123456789‘");

 reflushModel();
}

void mysql::reflushModel()
{
 m_goodsmodel.setQuery("select * from tb_goods", QSqlDatabase::database("file", true));
 m_barcodemodel.setQuery("select * from tb_barcode", QSqlDatabase::database("file", true));
}

void mysql::setAttibutes(QTableView* pView, int nHeaderHeight, int nColumnHeight)
{
 if ( pView == NULL )
 {
 QString strTemp = QStringLiteral("pView== NULL!设置表格属性失败!");
 return;
 }

 pView->horizontalHeader()->setFixedHeight(nHeaderHeight);  //设置表头的高度
 pView->horizontalHeader()->setSectionsClickable(false);   //设置表头不可点击(默认点击后进行排序)
 pView->horizontalHeader()->setStretchLastSection(true);   //最后一列占满剩余空白
 pView->setSelectionBehavior(QAbstractItemView::SelectRows);  //设置选择行为时每次选择一行 
 pView->setEditTriggers(QAbstractItemView::NoEditTriggers);  //使表视图只读 
 pView->verticalHeader()->setDefaultSectionSize(nColumnHeight);  //设置行高
 pView->setAlternatingRowColors(true);     //可以交替颜色显示
 pView->setShowGrid(false);      //设置不显示格子线
 pView->setCornerButtonEnabled(false);     //左上角的按钮不可用,此按钮功能,一点击,全选

 pView->horizontalScrollBar()->setStyleSheet(
 "QScrollBar:horizontal{height:10px;background:transparent;background-color:rgb(248, 248, 248);margin:0px,0px,0px,0px;padding-left:10px;padding-right:10px;}"
 "QScrollBar::handle:horizontal{height:10px;background:lightgray;border-radius:5px;/*min-height:20;*/}"
 "QScrollBar::handle:horizontal:hover{height:10px;background:gray;border-radius:5px;/*min-height:20;*/}"
 "QScrollBar::add-line:horizontal{/*height:10px;width:10px;*/border-image:url(:/button/images/button/right.png);/*subcontrol-position:right;*/}"
 "QScrollBar::sub-line:horizontal{/*height:10px;width:10px;*/border-image:url(:/button/images/button/left.png);/*subcontrol-position:left;*/}"
 "QScrollBar::add-line:horizontal:hover{/*height:10px;width:10px;*/border-image:url(:/button/images/button/right_mouseDown.png);/*subcontrol-position:right;*/}"
 "QScrollBar::sub-line:horizontal:hover{/*height:10px;width:10px;*/border-image:url(:/button/images/button/left_mouseDown.png);/*subcontrol-position:left;*/}"
 "QScrollBar::add-page:horizontal,QScrollBar::sub-page:horizontal{background:transparent;border-radius:5px;}"
 );

 pView->verticalScrollBar()->setStyleSheet(
 "QScrollBar:vertical{width:10px;background:transparent;background-color:rgb(248, 248, 248);margin:0px,0px,0px,0px;padding-top:10px;padding-bottom:10px;}"
 "QScrollBar::handle:vertical{width:10px;background:lightgray ;border-radius:5px;min-height:20;}"
 "QScrollBar::handle:vertical:hover{width:10px;background:gray;border-radius:5px;min-height:20;}"
 "QScrollBar::add-line:vertical{height:10px;width:10px;border-image:url(:/button/images/button/down.png);subcontrol-position:bottom;}"
 "QScrollBar::sub-line:vertical{height:10px;width:10px;border-image:url(:/button/images/button/up.png);subcontrol-position:top;}"
 "QScrollBar::add-line:vertical:hover{height:10px;width:10px;border-image:url(:/button/images/button/down_mouseDown.png);subcontrol-position:bottom;}"
 "QScrollBar::sub-line:vertical:hover{height:10px;width:10px;border-image:url(:/button/images/button/up_mouseDown.png);subcontrol-position:top;}"
 "QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical{background:transparent;border-radius:5px;}"
 );
}

4.备注

1.完整的代码下载http://download.csdn.net/detail/zhang_ruiqiang/8939977
2.还存在的问题使用自带的自增作为主键可能会出现越界的问题,不过integer最大为9223372036854775807如果数据量不是很大的话可以不必考虑
3.在vs2010+qt 5.40 + win7下编译通过
4.参考http://bbs.csdn.net/topics/391065975

版权声明:本文为博主原创文章,未经博主允许不得转载。

qt实现sqlite3的级联删除

标签:qt   sqlite3   级联删除   

热心网友 时间:2022-04-08 06:26

采用将项目中的sqlite文件拷到android内存卡上的固定位置,先判断位置上是否存在sqlite文件,不存在则复制文件。 sqlite可放在res的raw目录下,亦可放在assets下,放在assets下,可新建其他层次目录,本例选择assets
1.首先,添加sdcard权限在AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在activity中有如下代码

2.Java代码

button2.setOnClickListener(new Button.OnClickListener() {

@Override
publicvoid onClick(View arg0) {
try{
String DATABASE_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/testdb"; //将要存放于的文件夹
String DATABASE_FILENAME = "testDatabase.db"; //文件名
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
// 如果/sdcard/testdb目录中存在,创建这个目录
if (!dir.exists())
dir.mkdir();
// 如果在/sdcard/testdb目录中不存在
// test.db文件,则从asset\db目录中复制这个文件到
// SD卡的目录(/sdcard/testdb)
if (!(new File(databaseFilename)).exists()) {
// 获得封装testDatabase.db文件的InputStream对象
AssetManager asset=getAssets();
InputStream is=asset.open("db/testDatabase.db");
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = newbyte[8192];
int count = 0;
// 开始复制testDatabase.db文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
asset.close();
}
SQLiteDatabase mSQLiteDatabase=openOrCreateDatabase(databaseFilename, Activity.MODE_PRIVATE, null);//有则打开,没有创建
Cursor cur=mSQLiteDatabase.rawQuery("select * from table1", null);
if(cur!=null){
if(cur.moveToFirst()){
do{
int idColumnIndex=cur.getColumnIndex("id");
int numColumnIndex=cur.getColumnIndex("num");
int dataColumnIndex=cur.getColumnIndex("data");
int id=cur.getInt(idColumnIndex);
int num=cur.getInt(numColumnIndex);
String data=cur.getString(dataColumnIndex);
System.out.println("id:"+id+";num:"+num+";data:"+data);
}while(cur.moveToNext());
cur.close();
}
}
mSQLiteDatabase.close();//关闭数据库连接
}catch(Exception e){
e.printStackTrace();
}
//deleteDatabase("testDatabase.db");//删除数据库
}
});
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小篇幅造句 易车如何发布二手车 转让卖车信息流程 《易车》群聊消息关闭方法 易车消息夜间勿扰方法步骤 易车如何开启消息夜间勿扰 易车 开启@消息推送 ...当入射角是 时,反射角是 。我们能从各个方向看到本身不发光的物体... 发泄的近义词和反义词是什么_发泄是什么意思? 我的世界手游 我的世界手机版怎么做末地传送门? 我的世界手游 末地传送门怎么做? 安全评价师的报考科目有什么 本命年的女人梦见生女孩,又生一男孩,同时梦见过世的父母也在,什么预兆? 公司申请微信订阅号要钱么? 传染病法、血液法、母婴保健法的执业规定 什么是产前诊断? 母婴保健资格证 异地 可以用吗? 母婴保健技术服务的规章管理制度有哪些? 天津医药行业及全国医药行业所属单位有哪些? 产前诊断什么级别医院可以考试 关于生殖健康 活的大闸蟹如何存放? 哪些人需要在孕前进行遗传咨询或遗传学检查 无创dna怎样检测? 想摆个地摊卖小吃烤鱿鱼,请问烤鱿鱼的酱料制作技术到哪里学习呢,师傅教的? 松利铁板鱿鱼酱怎么样? 铁板鱿鱼用什么酱好品牌的 什么品牌的铁板鱿鱼酱最好吃? 铁板鱿鱼鸭肠酱哪个牌子的好吃 铁板鱿鱼酱料哪个品牌好? 打耳洞一个多月了,现在反复流脓,耳洞周围发黑起皮,我想摘掉耳钉,会不会长死? 耳洞发炎后,流脓了,换了耳钉,要不要转啊 OPPOR7怎样发图片到朋友圈 微信加到一个叫杭州艺赢教开抖音小店的,学费3680,是骗子吗? 杭州一男子将他人核酸检测结果转发至微信群被刑拘,他被刑拘的理由是什么? 加入微信群的物联网平台*吗?就是要有头像,名字,15位的身份证号码,3个月后就有9000元,如这 杭州男子打110要求加微信接警员秒懂,这背后有什么故事? QT中我用的是sqlite数据库,我需要根据我输入的用户名,来删除数据库表中一条或多条记录,请问怎么实现 今年最流行的卫衣绳子打结法 如何给卫衣上的绳子打结? Iphone健康数据怎么用?怎么显示各种数据? iPhone怎么显示之前每天的步数 鉴定丧失劳动能力的标准是什么 丧失劳动能力标准 职工非因工伤残或因病丧失劳动能力程度鉴定标准 怎么鉴定劳动能力是否丧失 荣耀60 pro配置 Qt sqlite3,该怎么解决 荣耀新出的手机荣耀60Pro怎么样? 荣耀60pro手机有哪几种颜色? 受控是啥意思 【广播剧】CV奇迹