基于sqlite的Qt 数据库封装 - 开源中国社区
- 格式:pdf
- 大小:704.49 KB
- 文档页数:7
[Android]Sqlite数据库操作⼯具封装类sqlite 数据库封装类DatabaseUtil.java(封装的类)package com.jack.androidbase.tools;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;/*** sqlite 数据库操作类*/public class DatabaseUtil {private static final String TAG = "DatabaseUtil";/*** Database Name*/private static final String DATABASE_NAME = "student_data";/*** Database Version*/private static final int DATABASE_VERSION = 1;/*** Table Name*/private static final String DATABASE_TABLE = "tb_student";/*** Table columns*/public static final String KEY_NAME = "name";public static final String KEY_GRADE = "grade";public static final String KEY_ROWID = "_id";/*** Database creation sql statement*/private static final String CREATE_TABLE ="create table " + DATABASE_TABLE + " (" + KEY_ROWID + " integer primary key autoincrement, "+ KEY_NAME + " text not null, " + KEY_GRADE + " text not null);";/*** Context*/private final Context mCtx;private DatabaseHelper mDbHelper;private SQLiteDatabase mDb;/*** Inner private class. Database Helper class for creating and updating database.*/private static class DatabaseHelper extends SQLiteOpenHelper {DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}/*** onCreate method is called for the 1st time when database doesn't exists.*/@Overridepublic void onCreate(SQLiteDatabase db) {Log.i(TAG, "Creating DataBase: " + CREATE_TABLE);db.execSQL(CREATE_TABLE);}/*** onUpgrade method is called when database version changes.*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.w(TAG, "Upgrading database from version " + oldVersion + " to "+ newVersion);}}/*** Constructor - takes the context to allow the database to be* opened/created** @param ctx the Context within which to work*/public DatabaseUtil(Context ctx) {this.mCtx = ctx;}/*** This method is used for creating/opening connection** @return instance of DatabaseUtil* @throws SQLException*/public DatabaseUtil open() throws SQLException {mDbHelper = new DatabaseHelper(mCtx);mDb = mDbHelper.getWritableDatabase();return this;}/*** This method is used for closing the connection.*/public void close() {mDbHelper.close();}/*** This method is used to create/insert new record record.** @param name* @param grade* @return long*/public long insert(String name, String grade) {ContentValues initialValues = new ContentValues();initialValues.put(KEY_NAME, name);initialValues.put(KEY_GRADE, grade);return mDb.insert(DATABASE_TABLE, null, initialValues);}/*** This method will delete record.** @param rowId* @return boolean*/public boolean delete(long rowId) {return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; }/*** This method will deleteAll record.** @return*/public boolean deleteAll() {return mDb.delete(DATABASE_TABLE, " 1 ", null) > 0;}/*** This method will return Cursor holding all the records.** @return Cursor*/public Cursor fetchAll() {return mDb.query(DATABASE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_GRADE}, null, null, null, null, null);}/*** This method will return Cursor holding the specific record.** @param id* @return Cursor* @throws SQLException*/public Cursor fetch(long id) throws SQLException {Cursor mCursor =mDb.query(true, DATABASE_TABLE, new String[]{KEY_ROWID,KEY_NAME, KEY_GRADE}, KEY_ROWID + "=" + id, null,null, null, null, null);if (mCursor != null) {mCursor.moveToFirst();}return mCursor;}/*** This method will update record.** @param id* @param name* @param standard* @return boolean*/public boolean update(int id, String name, String standard) {ContentValues args = new ContentValues();args.put(KEY_NAME, name);args.put(KEY_GRADE, standard);return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + id, null) > 0;}}使⽤详解:DatabaseUtil dbUtil = new DatabaseUtil(this);dbUtil.open();switch (v.getId()) {case R.id.other_btn_sqlite_list: //查询Cursor cursor = dbUtil.fetchAll();if (cursor != null) {while (cursor.moveToNext()) {Log.i("Student", "ID:" + cursor.getInt(0) + ",Student Name: " + cursor.getString(1) + ",Grade: " + cursor.getString(2));}}break;case R.id.other_btn_sqlite_add:dbUtil.insert("Prashant Thakkar", "100");Log.i("Student", "add over");break;case R.id.other_btn_sqlite_update:dbUtil.update(1, "aa", "bb");Log.i("Student", "update over");break;case R.id.other_btn_sqlite_del:dbUtil.delete(2);Log.i("Student", "delete over");break;case R.id.other_btn_sqlite_del_all:dbUtil.deleteAll();Log.i("Student", "delete all over");break;}dbUtil.close();参考⽹址:https:///sowhat4999/p/4439856.htmlhttps:///ProMonkey/p/5765616.html (有添加单例模式)本博客地址:本⽂原⽂地址:转载请著名出处!谢谢~~。
1. 创建新类sqldb,会自动生成两个文件sqldb.h和sqldb.cpp(需指定其基类为QOBject):<sqldb.h>#include <QObject>#include <QSqlDatabase>class SqlDB : public Qobject{Q_OBJECTpublic:explicit SqlDB(QObject *parent = 0);void connectDB(); //创建连接函数void closeDB(); //创建关闭函数signals:private:QSqlDatabase db; //建立数据库的文件描述符};2.在sqldb.cpp中实现数据库函数的功能<sqldb.cpp>void SqlDB::connectDB(){db = QSqlDatabase::addDatabase("QSQLITE"); //添加sqlite类型的数据库db.setDatabaseName("server.s3db"); //指定数据库名为server.s3dbif (!db.open()){QMessageBox::critical(NULL, "sqlDB","connect error");return;}}void SqlDB::closeDB(){db.close();}3.在窗口中使用数据库<mainwin.h>添加头文件:#include <QSqlTableModel>#include "sqldb.h"在private:中添加数据库的打开指针和打开模式:SqlDB *db;QSqlTableModel *userModel;4.在窗口中的具体操作<mainwin.cpp>在主窗口中建立TableView控件#include "mainwin.h"#include "ui_mainwin.h"MainWin::MainWin(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWin){ui->setupUi(this);db = new SqlDB(this); //建立db->connectDB(); //连接this->userModel->clear(); //初始化用户模式this->userModel = new QSqlTableModel; //建立用户模式空间this->userModel->setTable("user"); //设置用户模式userModel->setHeaderData(0, Qt::Horizontal, "QQ");userModel->setHeaderData(1, Qt::Horizontal, "昵称");userModel->setHeaderData(2, Qt::Horizontal, "密码");userModel->setHeaderData(3, Qt::Horizontal, "IP");userModel->setHeaderData(4, Qt::Horizontal, "port");userModel->setHeaderData(5, Qt::Horizontal, "状态");this->userModel->select();this->ui->tableView->setModel(userModel);}。
sqlite3的基本使⽤以及封装使⽤1基本使⽤1.打开数据库int sqlite3_open(const char *filename, // 数据库的⽂件路径sqlite3 **ppDb // 数据库实例);2.执⾏任何SQL语句int sqlite3_exec(sqlite3*, // ⼀个打开的数据库实例const char *sql, // 需要执⾏的SQL语句int (*callback)(void*,int,char**,char**), // SQL语句执⾏完毕后的回调void *, // 回调函数的第1个参数char **errmsg // 错误信息);3.检查SQL语句的合法性(查询前的准备)int sqlite3_prepare_v2(sqlite3 *db, // 数据库实例const char *zSql, // 需要检查的SQL语句int nByte, // SQL语句的最⼤字节长度sqlite3_stmt **ppStmt, // sqlite3_stmt实例,⽤来获得数据库数据const char **pzTail);4.查询⼀⾏数据int sqlite3_step(sqlite3_stmt*); // 如果查询到⼀⾏数据,就会返回SQLITE_ROW5.利⽤stmt获得某⼀字段的值(字段的下标从0开始)double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // ⼆进制⽂本数据const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据1创建⼀个model类,.h⽂件#import <Foundation/Foundation.h>@interface IWStudent : NSObject@property (nonatomic, assign) int ID;@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@end.m⽂件#import"IWStudent.h"@implementation IWStudent@end2创建⼯具类....封装⽅法.h⽂件#import <Foundation/Foundation.h>@class IWStudent;@interface IWStudentTool : NSObject/*** 添加学⽣** @param student 需要添加的学⽣*/+ (BOOL)addStudent:(IWStudent *)student;/*** 获得所有的学⽣** @return 数组中装着都是IWStudent模型*/+ (NSArray *)students;/*** 根据搜索条件获得对应的学⽣** @param condition 搜索条件*/+ (NSArray *)studentsWithCondition:(NSString *)condition;@end.m⽂件#import"IWStudentTool.h"#import"IWStudent.h"#import <sqlite3.h>@implementation IWStudentTool// static的作⽤:能保证_db这个变量只被IWStudentTool.m直接访问static sqlite3 *_db;+ (void)initialize{// 0.获得沙盒中的数据库⽂件名NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"]; // 1.创建(打开)数据库(如果数据库⽂件不存在,会⾃动创建)int result = sqlite3_open(filename.UTF8String, &_db);if (result == SQLITE_OK) {NSLog(@"成功打开数据库");// 2.创表const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";char *errorMesg = NULL;int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功创建t_student表");} else {NSLog(@"创建t_student表失败:%s", errorMesg);}} else {NSLog(@"打开数据库失败");}}+ (BOOL)addStudent:(IWStudent *)student{NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", , student.age];char *errorMesg = NULL;int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);return result == SQLITE_OK;}+ (NSArray *)students{// 0.定义数组NSMutableArray *students = nil;// 1.定义sql语句const char *sql = "select id, name, age from t_student;";// 2.定义⼀个stmt存放结果集sqlite3_stmt *stmt = NULL;// 3.检测SQL语句的合法性int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"查询语句是合法的");students = [NSMutableArray array];// 4.执⾏SQL语句,从结果集中取出数据while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查询到⼀⾏数据// 获得这⾏对应的数据IWStudent *student = [[IWStudent alloc] init];// 获得第0列的idstudent.ID = sqlite3_column_int(stmt, 0);// 获得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1); = [NSString stringWithUTF8String:(const char *)sname];// 获得第2列的agestudent.age = sqlite3_column_int(stmt, 2);// 添加到数组[students addObject:student];}} else {NSLog(@"查询语句⾮合法");}return students;}+ (NSArray *)studentsWithCondition:(NSString *)condition{// 0.定义数组NSMutableArray *students = nil;// 1.定义sql语句const char *sql = "select id, name, age from t_student where name like ?;";// 2.定义⼀个stmt存放结果集sqlite3_stmt *stmt = NULL;// 3.检测SQL语句的合法性int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"查询语句是合法的");students = [NSMutableArray array];// 填补占位符的内容NSString *newCondition = [NSString stringWithFormat:@"%%%@%%", condition]; // NSLog(@"%@", newCondition);sqlite3_bind_text(stmt, 1, newCondition.UTF8String, -1, NULL);// 4.执⾏SQL语句,从结果集中取出数据while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查询到⼀⾏数据// 获得这⾏对应的数据IWStudent *student = [[IWStudent alloc] init];// 获得第0列的idstudent.ID = sqlite3_column_int(stmt, 0);// 获得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1); = [NSString stringWithUTF8String:(const char *)sname];// 获得第2列的agestudent.age = sqlite3_column_int(stmt, 2);// 添加到数组[students addObject:student];}} else {NSLog(@"查询语句⾮合法");}return students;}@end2.封装为⼯具类。
qt mysql使用的简单封装以下是一个简单的封装示例,用于在Qt中使用MySQL数据库:1. 创建一个MySQLWrapper类:cpp#ifndef MYSQLWRAPPER_H#define MYSQLWRAPPER_H#include <QtSql>#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>class MySQLWrapper{public:bool connect(const QString& host, const QString& username, const QString& password, const QString& database);void disconnect();bool isConnected() const;bool execQuery(const QString& query);bool execNonQuery(const QString& query);QSqlQuery getQuery(const QString& query);private:QSqlDatabase m_database;};#endif MYSQLWRAPPER_H2. 实现MySQLWrapper类的方法:cpp#include "mysqlwrapper.h"bool MySQLWrapper::connect(const QString& host, const QString& username, const QString& password, const QString& database) {创建数据库连接m_database = QSqlDatabase::addDatabase("QMYSQL");m_database.setHostName(host);m_database.setUserName(username);m_database.setPassword(password);m_database.setDatabaseName(database);打开数据库连接if (!m_database.open()){qDebug() << "Failed to connect to database:" << m_stError().text();return false;}return true;}void MySQLWrapper::disconnect(){关闭数据库连接m_database.close();}bool MySQLWrapper::isConnected() const{检查数据库连接状态return m_database.isOpen();}bool MySQLWrapper::execQuery(const QString& query){QSqlQuery q(query, m_database);执行查询操作if (!q.exec()){qDebug() << "Failed to execute query:" << stError().text();return false;}return true;}bool MySQLWrapper::execNonQuery(const QString& query){QSqlQuery q(query, m_database);执行非查询操作if (!q.exec()){qDebug() << "Failed to execute non-query:" <<stError().text();return false;}return true;}QSqlQuery MySQLWrapper::getQuery(const QString& query){QSqlQuery q(query, m_database);返回查询结果return q;}3. 在使用MySQL数据库的地方,创建MySQLWrapper对象并使用相关方法:cpp#include "mysqlwrapper.h"int main(){MySQLWrapper db;连接到MySQL数据库db.connect("localhost", "root", "password", "mydatabase");if (db.isConnected()){执行查询操作db.execQuery("SELECT * FROM mytable");执行非查询操作db.execNonQuery("INSERT INTO mytable (name, age) VALUES ('John', 25)");获取查询结果QSqlQuery query = db.getQuery("SELECT * FROM mytable");while (query.next()) {QString name = query.value(0).toString();int age = query.value(1).toInt();qDebug() << "Name:" << name << ", Age:" << age;}}断开与数据库的连接db.disconnect();return 0;}这是一个简单的封装示例,用于在Qt中使用MySQL数据库。
当然我们一定要记住这个顺序,先创建数据库,然后再去创建一个表(作为菜鸟的我犯这个错误了),还有一点需要注意的红色标记的那句话,我参考的数籍一般都这样写db.setDatabaseName(":memory:");这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到。
上面使我们创建了一个数据库和一个表,那么我们如何把它呈现在我们的QTableview部件上呢?QSqlTableModel *model = new QSqlTableModel;model->setTable("person");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();ui->tableView->setModel(model);ui->tableView->show();上面的代码就把数据库中的信息不加筛选的打印到控件上了。
第一次写博客大家多多包涵。
Qt中提高sqlite的读写速度SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......)values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。
SQLite 数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。
事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。
下面是一个简单的QT sqlite数据库事务的例子:#include <QtCore/QCoreApplication>#include <QtSql>#include <iostream>using namespace std;int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");db_sqlite.setDatabaseName("SQLiteDB.db3");db_sqlite.open();QSqlQuery query("", db_sqlite);bool bsuccess = false;QTime tmpTime;// 开始启动事务db_sqlite.transaction();tmpTime.start();for(int i = 0; i<100000; i++){bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");if (!bsuccess){cout<<"Error occur"<<endl;break;}}// 提交事务,这个时候才是真正打开文件执行SQL语句的时候db_mit();cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;}其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行query.exec(...)——关闭文件。
在Qt中使⽤SQLite数据库前⾔SQLite(sql)是⼀款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,⾮常适合嵌⼊式系统。
Qt5以上版本可以直接使⽤SQLite(Qt⾃带驱动)。
⽤法1 准备1. 引⼊SQL模块在Qt项⽬⽂件(.pro⽂件)中,加⼊SQL模块:QT += sql2. 引⽤头⽂件在需要使⽤SQL的类定义中,引⽤相关头⽂件。
例如:#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>2 使⽤1. 建⽴数据库检查连接、添加数据库驱动、设置数据库名称、数据库登录⽤户名、密码。
QSqlDatabase database;if (QSqlDatabase::contains("qt_sql_default_connection")){database = QSqlDatabase::database("qt_sql_default_connection");}else{database = QSqlDatabase::addDatabase("QSQLITE");database.setDatabaseName("MyDataBase.db");database.setUserName("XingYeZhiXia");database.setPassword("123456");}上述代码解释:(1)第⼀⾏中,建⽴了⼀个QSqlDatabase对象,后续的操作要使⽤这个对象。
(2)if语句⽤来检查指定的连接(connection)是否存在。
这⾥指定的连接名称(connection name)是qt_sql_default_connection,这是Qt默认连接名称。
基于Qt4的SQLite数据库应用编程
潘学文;文汉云
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2011(000)004
【摘要】介绍SQLite数据库的特点与QtSQL模块的组成部分,结合一个编程实例,讲解了Qt中SQLite数据库应用编程过程,包括SQLite数据库文件的创建、数据库的连接、数据库的SQL语句及模型类操作方法.
【总页数】2页(P49-50)
【作者】潘学文;文汉云
【作者单位】长江大学计算机科学学院,荆州434023;长江大学计算机科学学院,荆州434023
【正文语种】中文
【相关文献】
1.基于Linux与Qt4的网络数码相框实现 [J], 童凯;张红雨
2.基于Linux Qt4下自定义对话框的设计与实现 [J], 项伟
3.基于Qt4/VS2010平台的自动测试系统 [J], 李林林;杨帆;张飞飞;宋保清;宋兵兵
4.基于Qt4的远程视频监控系统设计与实现 [J], 徐志娟
5.基于Qt4的LHCD相位控制软件的设计 [J], 尚家宇;杨永;单家方;吴则革;朱梁因版权原因,仅展示原文概要,查看原文内容请购买。
qt连接数据库的方法1. 简介Qt是一个跨平台的开发框架,提供了丰富的GUI控件和易于使用的API。
它也支持与各种数据库的连接。
在本篇文章中,我们将介绍Qt如何连接数据库。
我们将涵盖Qt 支持的各种数据库类型,例如SQLite、MySQL和PostgreSQL等。
2. SQLite数据库连接SQLite是一个轻量级的关系型数据库,可以在任何平台上使用,并且无需安装。
以下是Qt连接SQLite数据库的示例代码:```cppinclude <QCoreApplication>include <QtSql>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){qDebug() << "Failed to connect to database.";return 1;}qDebug() << "Database connected successfully.";// Do some database-related work heredb.close();return a.exec();}```在上面的示例中,我们首先使用`QSqlDatabase::addDatabase()`函数创建一个数据库连接,然后使用`setDatabaseName()`函数指定要连接的数据库文件的名称。
如果连接成功,则应该输出“Database connected successfully.”,否则输出“Failed to connect to database.”。
QT操作数据库SQLite实例#include "widget.h"#include <QApplication>#include <QtSql>#include <QTextCodec>#include <QDebug>int main(int argc, char *argv[]){QApplication a(argc, argv);QTextCodec::setCodecForTr(QTextCodec::codecForLocale());/*QStringList drivers = QSqlDatabase::drivers(); //获取⽀持的SQL驱动for( int i=0; i!=drivers.count(); i++ )qDebug() << "driver: " << drivers.at(i);*/QSqlDatabase dbconn=QSqlDatabase::addDatabase("QSQLITE"); //添加数据库驱动dbconn.setDatabaseName("mytest.db"); //在⼯程⽬录新建⼀个mytest.db的⽂件if(!dbconn.open()){qDebug()<<"error";}QSqlQuery query(dbconn);//以下执⾏相关QSL语句//新建student表,id设置为主键,还有⼀个name项query.exec("create table student(id varchar,name varchar)");query.exec(QObject::tr("insert into student values(1,'李刚')"));query.exec(QObject::tr("insert into student values(2,'苹果')"));query.exec(QObject::tr("insert into student values(3,'葡萄')"));query.prepare("insert into student values(?,?)");QVariantList ids;ids << 4 << 5 << 6;query.addBindValue(ids);QVariantList names;names << "kevin" << "xiang" << "jie";query.addBindValue(names);if( !query.execBatch() )qDebug() << "Error: " << stError();query.exec("update student set name='xiangjie' where id=5"); //更新query.exec("delete from student where id=6"); //删除//query.exec("select id,name from student where id>=2");query.exec("select * from student");while(query.next())//query.next()指向查找到的第⼀条记录,然后每次后移⼀条记录{int ele0=query.value(0).toInt();//query.value(0)是id的值,将其转换为int型QString ele1=query.value(1).toString();qDebug()<< query.at() << ele0<<ele1;//输出两个值}query.seek(3);QSqlRecord record = query.record(); //获取当前⾏记录qDebug() << "id: " << record.value("id").toInt() << " name: " << record.value("name").toString();QSqlField field = record.field(1); //获取索引字段qDebug() << "field name:" << () << " field value:" << field.value().toString();query.exec(QObject::tr("drop table student")); //删除table//return a.exec();}。