QT:sqlite创建并访问数据库

2023-11-03

本文代码在博文:https://blog.csdn.net/frieryumao/article/details/93871774 基础上实现创建数据库并实现数据库访问。
##知识点
1.读写锁防止多线程资源竞争
2.sqlite实现数据库创建、插入、删除、查询操作
3.增加:执行的sql语句把"“替换为’’,防止sql执行时字符串内包含"使得字符串被截断;例如下图
在这里插入图片描述
在这里插入图片描述上图中红框多了一个”,使得字符串被截断为绿框内容,where约束失效,使得本来只修改where rp_id=1一条语句,变成全部语句都被修改;
因此为解决上述问题,sql语句用’’,需要保存到数据库的数据中含有’要替换为’’

#ifndef DATABASESQL_H
#define DATABASESQL_H
/******************************************************************************
**FileName: sqlite操作语句
**Function: 聊天记录文件的创建、插入、删除、查询操作
**Version record:
**Version       Author         Data          Description
**v1.0.1        wlj          2019.05.17        first draft
*******************************************************************************/

#include <QString>

struct RecvMsgStruct
{
    qint32 iCmdType;
    qint32 iMsgType;
    QString sUserId;
    QString sUserName;
    qint32 iUserStatus;
    QString sTime;
    QString sMsg;
    int iMsgSize;
    QString sGrpId;
    QString sGrpName;
    QString sUserImage;
    QString sUserPicSuffix;//1表示是owner 0表示聊天对象
    QString sMsgId;
    int iMsgClass;
    struct fileClass stFileClass;
    RecvMsgStruct operator=(RecvMsgStruct& tmpRecvMsg)
    {
        iCmdType = tmpRecvMsg.iCmdType;
        iMsgType = tmpRecvMsg.iMsgType;
        sUserId = tmpRecvMsg.sUserId;
        sUserName = tmpRecvMsg.sUserName;
        iUserStatus = tmpRecvMsg.iUserStatus;
        sTime = tmpRecvMsg.sTime;
        sMsg = tmpRecvMsg.sMsg;
        iMsgSize = tmpRecvMsg.iMsgSize;
        sGrpId = tmpRecvMsg.sGrpId;
        sGrpName = tmpRecvMsg.sGrpName;
        sUserImage = tmpRecvMsg.sUserImage;
        sUserPicSuffix = tmpRecvMsg.sUserPicSuffix;
        sMsgId = tmpRecvMsg.sMsgId;
        iMsgClass = tmpRecvMsg.iMsgClass;
        stFileClass = tmpRecvMsg.stFileClass;
        //c = tmpRecvMsg.c;
        return *this;
    }
    RecvMsgStruct()
    {
        iCmdType = 0;
        iMsgType = 0;
        sUserId = "";
        sUserName = "";
        iUserStatus = 0;
        sTime = "";
        sMsg = "";
        iMsgSize = 0;
        sGrpId = "";
        sGrpName = "";
        sUserImage = "";
        sUserPicSuffix = "";
        sMsgId = "";
        iMsgClass = 0;
    }
};
// ChatMsg.db
#define SQL_CREATE_CHATMSG_SINGLE QString("create table if not exists %1(\
type_msgid varchar(128) primary key,\
type_msg varchar(4000),\
type_timer varchar(64) not null,\
type_userid varchar(8) not null,\
type_username varchar(32) not null,\
type_filepath varchar(128),\
type_msgclass varchar(1) not null,\
type_isownerflag varchar(1) not null)")
#define SQL_CREATE_CHATMSG_GROUP QString("create table if not exists \"%1\"(\
type_msgid varchar(128) primary key,\
type_msg varchar(4000),\
type_timer varchar(64) not null,\
type_userid varchar(8) not null,\
type_username varchar(32) not null,\
type_groupid varchar(16),\
type_filepath varchar(128),\
type_msgclass varchar(1) not null)")
~~#define SQL_INSERT_CHATMSG_SINGLE QString("insert into \"%1\" values(\"%2\",\"%3\",\"%4\",\"%5\",\"%6\",\"%7\",\"%8\",\"%9\")")
#define SQL_INSERT_CHATMSG_GROUP QString("insert into \"%1\" values(\"%2\",\"%3\",\"%4\",\"%5\",\"%6\",\"%7\",\"%8\",\"%9\")")
#define SQL_SELECT_CHATMSG_BY_TABLE QString("select * from \"%1\"")
#define SQL_SELECT_ONE_CHATMSG_BY_TABLE QString("select * from \"%1\" where type_msgid=\"%2\"")~~ 
#define SQL_INSERT_CHATMSG_SINGLE QString("insert into \‘%1\‘ values(\‘%2\‘,\‘%3\‘,\‘%4\‘,\‘%5\‘,\‘%6\‘,\‘%7\‘,\‘%8\‘,\‘%9\‘)")
#define SQL_INSERT_CHATMSG_GROUP QString("insert into \‘%1\‘ values(\‘%2\‘,\‘%3\‘,\‘%4\‘,\‘%5\‘,\‘%6\‘,\‘%7\‘,\‘%8\‘,\‘%9\‘)")
#define SQL_SELECT_CHATMSG_BY_TABLE QString("select * from \‘%1\‘")
#define SQL_SELECT_ONE_CHATMSG_BY_TABLE QString("select * from \‘%1\‘ where type_msgid=\‘%2\‘")

//获取最后N条数据,取出的第一条数据为时间最新的数据    参数1:表名  参数2:聊天对象ID号,参数3:获取前N条
~~#define SQL_SELECT_CHATMSG_SINGLE_LASTTOPN QString("select * from \"%1\" where type_userid=\"%2\" order by type_timer desc limit \"%3\"")
#define SQL_SELECT_CHATMSG_GROUP_LASTTOPN QString("select * from \"%1\" where type_groupid=\"%2\" order by type_timer desc limit \"%3\"")
#define SQL_DELETE_CHATMSG_BY_MSGID QString("delete from \"%1\" where type_msgid=\"%2\"")~~ 
#define SQL_SELECT_CHATMSG_SINGLE_LASTTOPN QString("select * from \‘%1\‘ where type_userid=\‘%2\‘ order by type_timer desc limit \‘%3\‘")
#define SQL_SELECT_CHATMSG_GROUP_LASTTOPN QString("select * from \‘%1\‘ where type_groupid=\‘%2\‘ order by type_timer desc limit \‘%3\‘")
#define SQL_DELETE_CHATMSG_BY_MSGID QString("delete from \‘%1\‘ where type_msgid=\‘%2\‘")


#endif // DATABASESQL_H

#ifndef APPDATABASE_H
#define APPDATABASE_H
/******************************************************************************
**FileName: 客户端数据库
**Function:
**          1:提供插入单人/群聊数据接口
**          2:提供撤销单人/群聊数据接口
**          3:提供获取单人/群聊历史聊天记录接口
**Version record:
**Version       Author         Data          Description
**v1.0.1        wlj  2019.05.22        first draft
*******************************************************************************/
#include<QtSql>
#include<QString>
#include<QMutex>
#include<QMutexLocker>
#include"connectionpool.h"
#include"databasesql.h"
#include "../public.h"
#include"../chat.h"

extern Quser g_user;
#define HISTORYNUM 50

class AppDataBase
{
public:
    /******************************************************************************
* Function: 插入单人/群聊数据
* InPut   : recvMsgStruct 一条聊天数据信息
* OutPut  : 无
* Return  : true插入成功,false插入失败
* Other   :
* Author  : wlj  2019.05.22
*******************************************************************************/
    static bool AddSingleHistoryMsg(struct RecvMsgStruct& recvMsgStruct);
    static bool AddGroupHistoryMsg(struct RecvMsgStruct& recvMsgStruct);

    /******************************************************************************
* Function: 获取一条单人/群聊数据
* InPut   : typeMsgid:聊天记录的msgId
* OutPut  : valueInfo 一条聊天数据信息
* Return  : true查询成功,false查询失败
* Other   :
* Author  : wlj  2019.05.22
*******************************************************************************/
    static bool GetSingleOneMsg(QString &typeMsgid, QVector<QVariant> &valueInfo);
    static bool GetGroupOneMsg(QString &typeMsgid, QVector<QVariant> &valueInfo);

    /******************************************************************************
* Function: 撤销单人/群聊数据
* InPut   : typeMsgid:删除该聊天记录的msgId
* OutPut  : 无
* Return  : true撤销成功,false撤销失败
* Other   :
* Author  : wlj  2019.05.22
*******************************************************************************/
    static bool DeleteSingleHistory(QString &typeMsgid);
    static bool DeleteGroupHistory(QString &typeMsgid);

    /******************************************************************************
* Function: 获取单人/群聊历史聊天记录
* InPut   : typeUserid/typeGroupid聊天对象  count默认读取聊天记录条数
* OutPut  : valuesList聊天记录列表,valuesList[0]是时间最近的数据
* Single:valuesList[0][i]:type_msgid,type_msg,type_timer,type_userid,type_username,type_filepath,type_msgclass
* Group :valuesList[0][i]:type_msgid,type_msg,type_timer,type_userid,type_username,type_groupid, type_filepath,type_msgclass
* Return  : true获取成功,false获取失败
* Other   :
* Author  : wlj  2019.05.22
*******************************************************************************/
    static bool QuerySingleHistory(QString typeUserid, QList<QVector<QVariant>> &valuesList, const int &count = HISTORYNUM);
    static bool QueryGroupHistory(QString typeGroupid, QList<QVector<QVariant>> &valuesList,const int &count = HISTORYNUM);

    /******************************************************************************
* Function: 打印数据库所有的表格内容,测试用
* InPut   : 无
* OutPut  : 所有聊天记录
* Return  : 无
* Other   :
* Author  : wlj  2019.05.22
*******************************************************************************/
    static void QueryAll();
    ~AppDataBase();

private:
    AppDataBase();
    static AppDataBase *GetInstance();
    void AddNewclient();
    bool InsertData(const QString sqlStr);
    bool SelectTopNData(const QString sqlStr, int fieldsCount, QList<QVector<QVariant>> &valuesList);
    bool DeleteData(const QString sqlStr);
    AppDataBase(const AppDataBase&){}
//    AppDataBase & operator=(const AppDataBase &){}//禁止赋值拷贝构造函数
    class GarbageCollector
    {
    public:
        ~GarbageCollector()
        {
            if(NULL != AppDataBase::m_DataBaseInstance)
            {
                qDebug()<<"release AppDataBase::m_DataBaseInstance";
                delete AppDataBase::m_DataBaseInstance;
                AppDataBase::m_DataBaseInstance = nullptr;
            }
        }
    };

private:
    static GarbageCollector m_gc;          //静态变量,只是为了释放单例
    static AppDataBase* m_DataBaseInstance;
    static QMutex m_Mutex;

    QString m_UserSingleTable;//单人聊天表名称
    QString m_UserGroupTable;//群聊天表名称
    QReadWriteLock m_rwLock;//读写锁
    QString m_FilesPath;
    QString m_ChatMsgPath;
};

#endif // APPDATABASE_H

#include<QDir>
#include"appdatabase.h"


#define HOSTNAME "127.0.0.1"
#define DATABASETYPE "QSQLITE"
#define SINGLEFILELINE 8
#define GROUPFILELINE 8
#define CHATMSGFOLDER "ChatMsg";
//QString g_DataBaseName = "/ChatMsg.db";

#define FILESFOLDER "Files";
//#define DBPATH "./ChatMsg"
#define  DATABSENAME "ChatMsg.db"
//#define TESTBUTTON 1
QMutex AppDataBase::m_Mutex;
AppDataBase::GarbageCollector AppDataBase::m_gc;
AppDataBase* AppDataBase::m_DataBaseInstance = NULL;

void AppDataBase::QueryAll()
{
    QSqlDatabase db = ConnectionPool::OpenConnection();
    QSqlQuery query(SQL_SELECT_CHATMSG_BY_TABLE.arg(AppDataBase::GetInstance()->m_UserSingleTable), db);

    qDebug()<<"print SingleTable Info!";
    while (query.next())
    {
        qDebug() << query.value(0).toString() << query.value(1).toString()
                 << query.value(2).toString() << query.value(3).toString()
                 << query.value(4).toString() << query.value(5).toString()
                 << query.value(6).toString()<< query.value(7).toString();
    }

    query = QSqlQuery(SQL_SELECT_CHATMSG_BY_TABLE.arg(AppDataBase::GetInstance()->m_UserGroupTable), db);

    qDebug()<<"print GroupTable Info!";
    while (query.next())
    {
        qDebug() << query.value(0).toString() << query.value(1).toString()
                 << query.value(2).toString() << query.value(3).toString()
                 << query.value(4).toString() << query.value(5).toString()
                 << query.value(6).toString() << query.value(7).toInt();
    }
    ConnectionPool::CloseConnection(db);
}
AppDataBase::AppDataBase()
{
    qDebug()<<"AppDataBase::AppDataBase";
    //数据库文件目录,不存在则创建
    QString qsRunPath = QCoreApplication::applicationDirPath();
    m_FilesPath = qsRunPath + "//" + FILESFOLDER;
    m_ChatMsgPath = qsRunPath + "//" + CHATMSGFOLDER;
    QDir dir;

    if(!dir.exists(m_FilesPath))//判断路径是否存在
    {
        (void)dir.mkpath(m_FilesPath); //创建路径
        qDebug()<<"mkpath: "<<qPrintable(m_FilesPath);
    }

    if(!dir.exists(m_ChatMsgPath))//判断路径是否存在
    {
        (void)dir.mkpath(m_ChatMsgPath); //创建路径
        qDebug()<<"mkpath: "<<qPrintable(m_ChatMsgPath);
    }
    QString chatFilePath = m_ChatMsgPath + "//" + DATABSENAME;
    ConnectionPool::SetParam(chatFilePath,DATABASETYPE);
    m_UserSingleTable = "Single"+ g_user.userID;
    m_UserGroupTable = "Group"+ g_user.userID;
#ifdef TESTBUTTON == 1
    m_UserSingleTable = "Single1234";
    m_UserGroupTable = "Group1234";
#endif
    AddNewclient();
}
AppDataBase::~AppDataBase()
{

}
AppDataBase *AppDataBase::GetInstance()
{
    if(NULL == m_DataBaseInstance)
    {
        QMutexLocker locker(&m_Mutex);
        if(NULL == m_DataBaseInstance)
        {
            AppDataBase *tmp = new AppDataBase();
            m_DataBaseInstance = tmp;
        }
    }
    return m_DataBaseInstance;
}
bool AppDataBase::GetSingleOneMsg(QString &typeMsgid, QVector<QVariant> &valueInfo)
{
    bool flag = true;

    QString sqlStr = SQL_SELECT_ONE_CHATMSG_BY_TABLE.arg(AppDataBase::GetInstance()->m_UserSingleTable).arg(typeMsgid);
    QList<QVector<QVariant> > valuesList;

    flag = AppDataBase::GetInstance()->SelectTopNData(sqlStr,SINGLEFILELINE,valuesList);
    if(flag && (0 != valuesList.size()) )
    {
        valueInfo = valuesList[0];
    }

    return flag;
}
bool AppDataBase::GetGroupOneMsg(QString &typeMsgid, QVector<QVariant> &valueInfo)
{
    bool flag = true;
    QString sqlStr = SQL_SELECT_ONE_CHATMSG_BY_TABLE.arg(AppDataBase::GetInstance()->m_UserGroupTable).arg(typeMsgid);
    QList<QVector<QVariant> > valuesList;

    flag = AppDataBase::GetInstance()->SelectTopNData(sqlStr,GROUPFILELINE,valuesList);
    if(flag && (0 != valuesList.size()) )
    {
        valueInfo = valuesList[0];
    }
    return flag;
}

bool AppDataBase::AddSingleHistoryMsg(struct RecvMsgStruct &recvMsgStruct)
{
    //遗留问题:sTime时间格式未转换,sFilepath未添加字段
//    QString sFilepath = AppDataBase::GetInstance()->m_FilesPath
//            + "//" + recvMsgStruct.stFileClass.sFileName
//            +"." + recvMsgStruct.stFileClass.sFileSuffix;

    QString sFilepath = recvMsgStruct.sMsg;
    QString sqlStr = SQL_INSERT_CHATMSG_SINGLE.arg(AppDataBase::GetInstance()->m_UserSingleTable)\
            .arg(recvMsgStruct.sMsgId)\
            .arg(recvMsgStruct.sMsg)\
            .arg(recvMsgStruct.sTime)\
            .arg(recvMsgStruct.sUserId)\
            .arg(recvMsgStruct.sUserName)\
            .arg(sFilepath)\
            .arg(recvMsgStruct.iMsgClass)\
            .arg(recvMsgStruct.sUserPicSuffix.toInt());

    return AppDataBase::GetInstance()->InsertData(sqlStr);
}

bool AppDataBase::AddGroupHistoryMsg(struct RecvMsgStruct &recvMsgStruct)
{
    //遗留问题:sTime时间格式未转换,sFilepath未添加字段
//     QString sFilepath = AppDataBase::GetInstance()->m_FilesPath
//             + "//" + recvMsgStruct.stFileClass.sFileName
//             +"." + recvMsgStruct.stFileClass.sFileSuffix;
    QString sFilepath = recvMsgStruct.sMsg;
    if(recvMsgStruct.sMsg.contains("'"))
    {
        recvMsgStruct.sMsg.replace("'", "''");
    }

    QString sqlStr = SQL_INSERT_CHATMSG_GROUP.arg(AppDataBase::GetInstance()->m_UserGroupTable)\
            .arg(recvMsgStruct.sMsgId)\
            .arg(recvMsgStruct.sMsg)\
            .arg(recvMsgStruct.sTime)\
            .arg(recvMsgStruct.sUserId)\
            .arg(recvMsgStruct.sUserName)\
            .arg(recvMsgStruct.sGrpId)\
            .arg(sFilepath)\
            .arg(recvMsgStruct.iMsgClass);

    return AppDataBase::GetInstance()->InsertData(sqlStr);
}
bool AppDataBase::QuerySingleHistory(QString typeUserid, QList<QVector<QVariant>> &valuesList, const int &count)
{
    QString sqlStr = SQL_SELECT_CHATMSG_SINGLE_LASTTOPN.arg(AppDataBase::GetInstance()->m_UserSingleTable).arg(typeUserid).arg(count);

    return AppDataBase::GetInstance()->SelectTopNData(sqlStr,SINGLEFILELINE,valuesList);
}
bool AppDataBase::QueryGroupHistory(QString typeGroupid, QList<QVector<QVariant>> &valuesList,const int &count)
{
    QString sqlStr = SQL_SELECT_CHATMSG_GROUP_LASTTOPN.arg(AppDataBase::GetInstance()->m_UserGroupTable).arg(typeGroupid).arg(count);

    return AppDataBase::GetInstance()->SelectTopNData(sqlStr,GROUPFILELINE,valuesList);
}
bool AppDataBase::DeleteSingleHistory(QString &typeMsgid)
{
    QString sqlStr = SQL_DELETE_CHATMSG_BY_MSGID.arg(AppDataBase::GetInstance()->m_UserSingleTable).arg(typeMsgid);

    return AppDataBase::GetInstance()->DeleteData(sqlStr);
}
bool AppDataBase::DeleteGroupHistory(QString &typeMsgid)
{
    QString sqlStr = SQL_DELETE_CHATMSG_BY_MSGID.arg(AppDataBase::GetInstance()->m_UserGroupTable).arg(typeMsgid);

    return AppDataBase::GetInstance()->DeleteData(sqlStr);
}
void AppDataBase::AddNewclient()
{
    // 从数据库连接池里取得连接
    QSqlDatabase db = ConnectionPool::OpenConnection();
    QSqlQuery query(db);

    if(!query.exec(SQL_CREATE_CHATMSG_SINGLE.arg(m_UserSingleTable)))
    {
        qWarning()<<"create "<< m_UserSingleTable<<" file fail,[SQL]= "<<qPrintable(query.lastError().text());
        ConnectionPool::CloseConnection(db);
        return;
    }

    if(!query.exec(SQL_CREATE_CHATMSG_GROUP.arg(m_UserGroupTable)))
    {
        qWarning()<<"create "<< m_UserGroupTable<<" file fail,[SQL]= "<<qPrintable(query.lastError().text());
        ConnectionPool::CloseConnection(db);
        return;
    }

    ConnectionPool::CloseConnection(db);
}

bool AppDataBase::InsertData(const QString sqlStr)
{
    QSqlDatabase db = ConnectionPool::OpenConnection();
    QWriteLocker wlocker(&m_rwLock);
    QSqlQuery query(db);

    if(!query.exec(sqlStr))
    {
        qWarning()<<"insert ChatMsg fail! [SQL] = "<<qPrintable(query.lastError().text());
        qDebug()<<"Fail Sqlite Operation : "<<qPrintable(sqlStr);
        ConnectionPool::CloseConnection(db);
        return false;
    }

    ConnectionPool::CloseConnection(db);
    return true;
}

bool AppDataBase::DeleteData(const QString sqlStr)
{
    QSqlDatabase db = ConnectionPool::OpenConnection();
    QSqlQuery query(db);

    QWriteLocker wlocker(&m_rwLock);
    if(!query.exec(sqlStr))
    {
        qWarning()<<"delete ChatMsg fail! [SQL] = "<<qPrintable(query.lastError().text());
        qDebug()<<"Fail Sqlite Operation : "<<qPrintable(sqlStr);
        ConnectionPool::CloseConnection(db);
        return false;
    }

    ConnectionPool::CloseConnection(db);
    return true;
}

bool AppDataBase::SelectTopNData(const QString sqlStr, int fieldsCount, QList<QVector<QVariant> > &valuesList)
{
    QSqlDatabase db = ConnectionPool::OpenConnection();
    QSqlQuery sql_query(db);

    QReadLocker rlocker(&m_rwLock);
    if(!sql_query.exec(sqlStr))
    {
        qWarning()<<"SelectData fail,[SQL] = "<<qPrintable(sql_query.lastError().text());
        qDebug()<<"Fail Sqlite Operation :"<<qPrintable(sqlStr);
        ConnectionPool::CloseConnection(db);
        return false;
    }

    while (sql_query.next())
    {
        QVector<QVariant> valueVector;
        valueVector.clear();
        for(int i=0; i<fieldsCount; i++)
        {
            valueVector.append(sql_query.value(i));
        }

        valuesList.append(valueVector);
    }

    return true;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT:sqlite创建并访问数据库 的相关文章

  • 锁定 SQLite 数据库以从 C# 读取

    我的项目有一个 C dll 其中在 Sqllite 中创建一个数据库 共享拒绝 无 这个 dll 会将数据插入到数据库中 我有一个 C exe 它必须访问数据库并显示它 显示需要异步完成 在启动与 sqlitedb 的连接时 有什么方法可以
  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 如何确保与 sqlite 和 NFS 的文件安全同步

    我最近将应用程序的工作区文件格式转换为 sqlite 为了确保 NFS 上的稳健操作 我使用了通用更新策略 对本地硬盘上临时位置中存储的副本进行了所有修改 仅在保存时 我才会通过使用临时文件复制原始文件来修改原始文件 可能在 NFS 上 我
  • SQLiteDatabase.openDatabase 与 SQLiteOpenHelper.getReadableDatabase

    这两种方法有什么区别吗 两者都返回一个打开的 SQLiteDatabase 如果数据库不存在 两者都可以创建数据库 当需要读 写时 SQLiteOpenHelper 还具有 getWriteableDatabase 我应该使用哪种方法以及在
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • Android 中的 Sugar ORM:更新 SQLite 中保存的对象

    我是在 Android 上使用 SQLite 和 Sugar ORM 进行应用程序开发的新手 并尝试阅读 Sugar ORM 文档 但没有找到有关如何更新 SQLite 中保存的对象的任何信息 更改对象属性后还可以保存对象吗 就像是 Cus
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • 如何向同一个 QMenu 添加多个 QAction?

    我正在尝试实现 Qt 菜单自定义 并且我提供了一个功能来添加相同的功能QAction在同一个人民币上下文菜单中多次 但是当我尝试这样做时 myMenu gt addAction myAction myMenu gt addAction my
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 是否可以在 Qt Creator 中将 Qt 样式表与升级的小部件一起使用?

    我正在尝试使用 Qt 样式表对标准小部件进行一些重大的重新设计 因此 在为不同的小部件手动完成大部分工作之后 objectName选择器 我决定以某种方式对类似的小部件进行分组 例如我有多个QFrames其作用类似于内部表单中的标题 我希望

随机推荐

  • 正点STM32F407核心板+ESP8266实现简单通信(详细讲解)

    1 ESP8266固件库的烧录 如果用串口助手连上板子 给8266发送AT指令发现老是报错error 可以重新烧录一下固件库 正点的ESP8266资料下载网址 http www openedv com thread 308397 1 1 h
  • tcp连接多久会自动断开_K8s 节点断开连接后,本在运行的 Pod 会如何?

    在工作节点与主节点断开连接后 工作节点上的 Pod 是什么状态 是否在继续运行 Kubernetes 控制器又在做什么 本文对此进行了实例研究 一一解答 作者 Bhargav Bhikkaji 翻译 Bach 才云 校对 星空下的文仔 才云
  • 微信小程序云开发之初体验(详细教程)

    微信小程序云开发之初体验 小程序云开发是微信最近推出的新的一项能力 它弱化了后端以及运维的概念 开发者无需搭建服务器 使用微信平台提供的api即可完成核心的业务开发 目前提供三大基础能力支持 云函数 在云端运行的代码 微信私有协议天然鉴权
  • 刷脸支付普及逐渐攀升产业生态逐渐形成

    刷脸让支付生态重返硬件年代 刷脸支付机具的生产 销售 铺设 维护涉及大量成本 客观存在压货风险大 后期服务难 地推成本高等问题 模式重而受益低 导致银行和大多数中小支付机构入局刷脸支付的意愿则整体薄弱得多 银联高调入局之际 2019 也是支
  • 《啊哈算法》学习——桶排序

    学习啊哈算法第一天 第一章第一节最快最简单的桶排序 问题描述 班级五名同学的分数排序 十分制 问题分析及思路 借助大小为10的一维数组 初始化为0 意味该分数没有人得 接下来处理分数 如有两个人得5分 即将a 5 2 记录下分数即出现次数后
  • Spring Validation 接口入参校验

    一 前言 JSR 是 Java Specification Requests 的缩写 含义为 JAVA 规范提案 JSR 303 Bean Validation 规范 正是一套基于 JavaBean 参数校验的标准 Hibernate Va
  • s3c2440移植ucGUI

    编译环境 ADS1 2 开发板 TQ2440 主要参考这篇文章 stm32 UCGUI 完美移植 ucGUI版本 3 90 ucGUI3 90下载地址 UCGUI最新3 90版源码 屏幕 联想VGA电脑屏幕 最大分辨率1024x768 1
  • vue如何编写自定义指令directive

    vue已经给我们内置了很多很好用的指令了 v mode v show 等等 但是有时候当这些指令不能满足我们需求的时候 我们还可以使用vue的自定义指令功能编写我们的指令 这是一个很强大的功能 需要说明的是 尽管自定义指令这个功能很强大 但
  • 3D MAX导出插件编写

    转 3D MAX导出插件编写 2011 6 9阅读1667 评论0 文章版权归博客园 BigCoder所有 转载请于明显位置标明原文作者及出处 以示尊重 原文出处 http www cnblogs com csyisong archive
  • 用GDB远程调试运行于QEMU的程序

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 测试环境 本文使用 Ubuntu 16 04 4 LTS QEMU 环境进行调试 3 用 GDB 调试 QEMU 内程序 3 1 编写用来调试的程序
  • 国内使用reCaptcha验证码的完整教程

    国内使用reCaptcha验证码的完整教程
  • 查看系统端口占用

    第一步 win R打开 输入cmd进入命令窗口 第二步 输入netstat ano回车 找到对应的进程PID为14472 或者采用这个方法 用 netstat ntlp 查看监听端口 无3000 第三步 输入命令tasklist回车 找到对
  • C#Expression表达式树(lambda)的使用——Parameter、Property、Call、构建Select、构建Where

    1 定义参数 Parameter 访问属性 Property private static void Main string args 1 定义参数 Parameter 访问属性 Property 定义表达式树中的参数或变量 linq表达式
  • SSH密码暴力破解及防御实战

    前言 本文对目前流行的 SSH 密码暴力破解工具进行实战研究 分析和总结 对渗透攻击测试和安全防御具有一定的参考价值 首先介绍几款常用的ssh暴力破解工具 1 hydra 海德拉 指定用户破解 Examples hydra l user P
  • nn.moduleList 和Sequential由来、用法和实例 —— 写网络模型

    对于cnn前馈神经网络如果前馈一次写一个forward函数会有些麻烦 在此就有两种简化方式 ModuleList和Sequential 其中Sequential是一个特殊的module 它包含几个子Module 前向传播时会将输入一层接一层
  • Python爬虫从入门到精通:(36)CrawlSpider实现深度爬取_Python涛哥

    我们来看下CrawlSpider实现深度爬取 爬取阳光热线标题 状态 和详情页内容 https wz sun0769 com political index politicsNewest id 1 type 4 page 创建CrawlSp
  • 找工作必看,用Python爬取数据分析岗位信息并可视化分析

    导读 最近经常收到人事小姐姐和猎头小哥哥的面试邀请 想想最近也不是招聘旺季呀 但又想到许多小伙伴们有找工作这方面的需求 今天就来分享一篇简单的爬虫案例 旨在跟大家一起分析一下部分招聘市场 以 数据分析 为例 Tips 本次爬虫案例分析结果仅
  • 内网内Linux(cenOs)安装telnet

    1 执行 rm f var run yum pid 关闭yum 2 https blog csdn net My SweetXue article details 112021778 无法使用yum安装 首先下载安装文件 下载地址附上 链接
  • Docker夺命连环15问,你能坚持第几问?

    文章目录 前言 1 什么是Docker 2 Docker的应用场景有哪些 3 Docker的优点有哪些 4 Docker与虚拟机的区别是什么 5 Docker的三大核心是什么 6 如何快速安装Docker 7 如何修改Docker的存储位置
  • QT:sqlite创建并访问数据库

    本文代码在博文 https blog csdn net frieryumao article details 93871774 基础上实现创建数据库并实现数据库访问 知识点 1 读写锁防止多线程资源竞争 2 sqlite实现数据库创建 插入