[置顶][原]SQLite的学习系列之获取数据库版本
2016-05-01 13:37 by 雪夜&流星, 阅读(3272) 阅读, 推荐(1) 推荐, 收藏, 编辑[置顶]Android Studio NDK 学习之接受Java传入的字符串
2015-08-18 13:30 by 雪夜&流星, 阅读(2313) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]Ubuntu 14.04编译Android Kernel
2015-02-07 18:28 by 雪夜&流星, 阅读(1854) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]运行编译好的Android模拟器
2015-02-07 18:21 by 雪夜&流星, 阅读(1707) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]编译Android源码过程中遇到的问题
2015-02-07 18:17 by 雪夜&流星, 阅读(2241) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]Android打包之Gradle打包
2015-01-22 19:24 by 雪夜&流星, 阅读(4994) 阅读, 推荐(1) 推荐, 收藏, 编辑[置顶][原]Android打包之跨平台打包
2015-01-22 15:49 by 雪夜&流星, 阅读(425) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]ffmpeg编译android 硬解码支持库 libstagefright
2014-11-06 11:16 by 雪夜&流星, 阅读(8205) 阅读, 推荐(5) 推荐, 收藏, 编辑[置顶][转]Handy adb commands for Android
2014-09-23 17:17 by 雪夜&流星, 阅读(307) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]零基础学习视频解码之android篇系列文章
2014-09-22 18:58 by 雪夜&流星, 阅读(1551) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]如何在Android用FFmpeg+SDL2.0解码图像线程
2014-09-18 21:09 by 雪夜&流星, 阅读(2133) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]如何在Android用FFmpeg+SDL2.0解码声音
2014-09-11 11:45 by 雪夜&流星, 阅读(2326) 阅读, 推荐(2) 推荐, 收藏, 编辑[置顶][原]如何在Android用FFmpeg+SDL2.0解码显示图像
2014-09-10 14:29 by 雪夜&流星, 阅读(5169) 阅读, 推荐(1) 推荐, 收藏, 编辑[置顶][原]如何在Android用FFmpeg解码图像
2014-09-01 21:29 by 雪夜&流星, 阅读(6339) 阅读, 推荐(1) 推荐, 收藏, 编辑[置顶][原]如何用Android NDK编译FFmpeg
2014-08-26 21:43 by 雪夜&流星, 阅读(6680) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]零基础学习在Android进行SDL开发系列文章
2014-08-22 00:21 by 雪夜&流星, 阅读(802) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]零基础学习视频解码系列文章
2014-08-06 01:31 by 雪夜&流星, 阅读(1451) 阅读, 推荐(2) 推荐, 收藏, 编辑[置顶][原]零基础学习视频解码之后记
2014-08-06 01:22 by 雪夜&流星, 阅读(466) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]零基础学习视频解码之seek
2014-08-06 01:00 by 雪夜&流星, 阅读(1854) 阅读, 推荐(0) 推荐, 收藏, 编辑[置顶][原]零基础学习视频解码之同步视频
2014-08-06 00:20 by 雪夜&流星, 阅读(1522) 阅读, 推荐(0) 推荐, 收藏, 编辑[原]SQLite的学习系列之获取数据库版本二
2016-05-11 16:00 by 雪夜&流星, 阅读(855) 阅读, 推荐(0) 推荐, 收藏, 编辑本系列文章主要是使用C++语言来调用其API,达到管中窥豹的目的。另外本文使用的开发环境为mac + clion,并且基于SQLite 3.7.14来进行开发.
一、去下载sqlite-amalgamation-3071400.zip,然后解压到文件夹(其结构目录树如下):
.
├── shell.c
├── sqlite3.c
├── sqlite3.h
└── sqlite3ext.h
二、新建一个sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷贝到sql_src目录下:
.
├── main.cpp
└── sql_src
├── sqlite3.c
└── sqlite3.h
三、在main.cpp中调用sqlite的代码如下:
/** * We get the version of the SQLite database. This time we will use an SQL query. */ #include <iostream> #include "./sql_src/sqlite3.h" using namespace std; int main() { sqlite3 *db; sqlite3_stmt *res; const char *file = "test.db"; int rc = sqlite3_open(file, &db); if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_step(res); if (rc == SQLITE_ROW) { cout << sqlite3_column_text(res, 0) << endl; } sqlite3_finalize(res); sqlite3_close(db); return 0; }
四、最后的运行结果如下:
3.7.14 Process finished with exit code 0
调用分析:
sqlite3 *db;
1、该sqlite3的结构定义了一个数据库句柄。每个打开的SQLite数据库是由数据库句柄表示。
sqlite3_stmt *res;
2、该sqlite3_stmt结构代表一个SQL语句。
int rc = sqlite3_open(file, &db);
3、该sqlite3_open()函数打开一个新的数据库连接。其参数是数据库名称和数据库句柄。在“test.db的”是采用了特殊的数据库名称导致打开一个内存数据库。函数的返回码指示数据库是否被成功打开。当连接成功建立,则返回SQLITE_OK。
if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
4、如果返回代码指示错误,我们打印邮件到控制台,关闭数据库处理,并终止该计划。该sqlite3_errmsg()函数返回错误的描述。它是否被打开时发生错误,与数据库连接句柄相关联的资源,应通过使其向sqlite3_close()函数释放。
rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
5、执行SQL语句之前,必须调用首先被编译成字节代码的sqlite3_prepare功能之一。 (该sqlite3_prepare()函数被弃用。)
sqlite3_prepare_v2()函数有五个参数。
第一个参数是从所述sqlite3_open()函数获得的数据库句柄。
第二个参数是要编译的SQL语句。
第三个参数为以字节为单位的SQL语句的最大长度。传递-1会导致读取SQL字符串到第一个零终止子字符串结束了。根据该文件,可以通过传递提供的SQL字符串的字节的确切数量获得一些小的性能优势。
第四个参数是语句句柄。这将指向预编译的语句,如果sqlite3_prepare_v2()成功运行
最后一个参数是一个指向SQL语句的未使用的部分。只有SQL字符串的第一个语句被编译,所以参数指向剩下什么未编译。我们传入0,因为该参数对我们不是很重要。
如果成功,sqlite3_prepare_v2()返回SQLITE_OK;否则错误代码返回
rc = sqlite3_step(res);
6、调用sqlite3_step()运行SQL语句。 SQLITE_ROW返回码表示有另一行准备。我们的SQL语句返回只有一行数据,因此,我们调用这个函数一次。
sqlite3_finalize(res);
7、该sqlite3_finalize()函数销毁准备语句对象。
sqlite3_close(db);
8、该sqlite3_close()函数关闭数据库连接。