Sqlite3 的确非常好用。小巧、速度快。近期研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。

导入SQLLite library并引入头文件.

libsqlite3.dylib本身是个链接,在这里它指向libsqlite3.0.dylib。也就是说在这里你加入libsqlite3.dylib和加入libsqlite3.0.dylib事实上是加入了同一个文件,没有差别,那为什么要加入libsqlite3.0.dylib呢?原因在于libsqlite3.dylib是旧版的sqlite3动态库。也就是说假设出现了新的动态库(如:libsqlite3.1.dylib)那libsqlite3.dylib将指向这个新的动态库(libsqlite3.1.dylib)所以建议还是要加入libsqlite3.0.dylib。

(1) 重要数据结构

sqlite 里最经常使用到的是 sqlite3
* 类型。

从数据库打开開始,sqlite就要为这个类型准备好内存。直到数据库关闭,整个过程都须要用到这个类型。当数据库打开时開始,这个类型的变量就代表了你要操作的数据库。以下再具体介绍。

(2) 打开数据库

打开数据库链接sqlite3_open使用方法

原型:

SQLITE_API int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);

用这个函数打开数据库操作。

须要传入两个參数,一是数据库文件名称,比方ZUOYOU1314Students.sqlite. 在iOS中通常是[fileUTF8String]

NSString * file = [documentsPathstringByAppendingPathComponent:@"ZUOYOU1314Students.sqlite"];

二是 sqlite3 ** 參数即前面提到的重要数据结构。这个结构底层细节怎样。你不要管它。函数返回值表示操作是否正确,假设是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。

具体这些宏的含义能够參考 sqlite3.h 文件。里面有具体定义.

參考代码例如以下:

//指向数据库的指针
static sqlite3 * db = nil; //打开数据库
+ (sqlite3 *)open
{
//推断数据库对象是否打开, 即db 是否有值
if (db != nil) {
//db有值, 直接使用,不须要再打开
return db;
} #pragma ------第一次实现了拷贝 第二次须要推断documents里面是否已经有数据库文件
//先找到documents文档
NSString * documentsPath = kDocuments;
//在documents 里面 拼接一个目录
NSString * file = [documentsPath stringByAppendingPathComponent:@"Students.sqlite"];
//从包里面取到 叫Students名字 后缀是sqlite的文件
NSString * bundleFile = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"sqlite"];
//创建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager]; //推断文件是否存在
if ([fileManager fileExistsAtPath:file] == NO) { //然后把包里的文件复制到documents目录里
[fileManager copyItemAtPath:bundleFile toPath:file error:nil];
//UTF8tring 会把C语言 转换为 OC字符串
}
sqlite3_open([file UTF8String], &db); return db;
}

(3) 关闭数据库

原型:
SQLITE_API int sqlite3_close(sqlite3 *);

參考代码例如以下:

/关闭数据库
+ (void)close
{
sqlite3_close(db);
db = nil;
}

(4) SQL语句操作


  (一)  sqlite3_exec:

原型:

SQLITE_API int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);

这就是运行一条 sql 语句的函数。

第1个參数不再说了,是前面open函数得到的指针。说了是重要数据结构。

第2个參数const char *sql 是一条 sql 语句。以/0结尾。

第3个參数sqlite3_callback 是回调,当这条语句运行之后,sqlite3会去调用你提供的这个函数。

第4个參数void * 是你所提供的指针,你能够传递不论什么一个指针參数到这里,这个參数终于会传到回调函数里面。假设不须要传递指针给回调函数。能够填NULL。等下我们再看回调函数的写法,以及这个參数的使用。

第5个參数char ** errmsg 是错误信息。

注意是指针的指针。sqlite3里面有非常多固定的错误信息。

运行 sqlite3_exec之后,运行失败时能够查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过改动你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就能够通过这个 char*得到详细错误提示。

说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都能够填 NULL。

填NULL表示你不须要回调。比方你做 insert 操作,做 delete 操作,做update
操作,就没有必要使用回调。而当你做 select 时,就要使用回调。由于 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

參考代码例如以下:

- (void)deleteButton
{
//打开数据库
sqlite3 * db = [DB open];
//运行删除
int falg = sqlite3_exec(db, "delete from BJS140523 where sName like '坐'", NULL, NULL, nil);
NSLog(@"444444 falg = %d",falg);
}

(二 ) sqlite3_prepare_v2:

原型:

SQLITE_API int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
<span style="font-family: 'Comic Sans MS';">   const char **pzTail     /* OUT: Pointer to unused portion of zSql */</span>

參考代码例如以下:

   int flag =sqlite3_prepare_v2(db, "select * from BJS140523 "  , -1, &stmt, nil);

(三) sqlite3_column_

原型:

SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

參考代码例如以下:

 int sID = sqlite3_column_int(stmt, 0);//列的编号从0開始
const unsigned char * sName = sqlite3_column_text(stmt, 1);
int sAge = sqlite3_column_int(stmt, 2);
const unsigned char * sSex = sqlite3_column_text(stmt, 3);

(四)sqlite3_step()

原型:

SQLITE_API int sqlite3_step(sqlite3_stmt*);

參考代码例如以下:

if (falg == SQLITE_OK) {
sqlite3_step(stmt);
}

(五)sqlite3_finalize()

原型:

SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);

參考代码例如以下:

sqlite3_finalize(stmt);

(六) sqlite3_bind_text

//bind  绑定

原型:

SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);

參考代码例如以下:

    int falg = sqlite3_prepare_v2(db, "update BJS140523 set sSex = ?,sAge = ?

where sID = ?

", -1, &stmt, nil);
//绑定
//问号是从 1 開始的 sqlite3_bind_text(stmt,1,[sex UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 2, age);
sqlite3_bind_int(stmt, 3, sID);



数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,的更多相关文章

  1. sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close

    sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...

  2. sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close

    打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sq ...

  3. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  4. Linux下用到数据库sqlite3

    最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...

  5. SQL Server数据库ROW_NUMBER()函数使用详解

    SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...

  6. ecshop数据库操作函数

    ecshop数据库操作函数 分类: ecshop和dede2013-09-23 14:02 1716人阅读 评论(0) 收藏 举报 本章我们将结合eschop二次开发一些常见的开发例子.来谈谈ecsh ...

  7. 【转】MySql数据库--mysql_real_escape_string()函数

    MySql数据库--mysql_real_escape_string()函数 unsigned long mysql_real_escape_string(MYSQL *mysql, char *to ...

  8. SQL Server数据库PIVOT函数的使用详解(一)

    http://database.51cto.com/art/201108/285250.htm SQL Server数据库中,PIVOT在帮助中这样描述滴:可以使用 PIVOT 和UNPIVOT 关系 ...

  9. MySQL数据库聚合函数

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库聚合函数时间:2019年2月25日内容:MySQL数据库聚合函数重点:MySQL数据库聚合函 ...

随机推荐

  1. apache也可以做负载均衡,跟nignx的区别是什么?

    后续更新中.. 参考 http://zhumeng8337797.blog.163.com/blog/static/100768914201242211633248/ 比较 http://zhan.r ...

  2. String or binary data would be truncated

    在使用Typed Dataset进行数据的插入时,会报这样的错:String or binary data would be truncated. 我碰到的原因是 数据库中字段的长度过段,插入时内容被 ...

  3. deep learning in nlp 资料文献

    Deep Learning for Natural Language Processing (without Magic) http://nlp.stanford.edu/courses/NAACL2 ...

  4. android 样式开发

    1. Android的样式一般定义在res/values/styles.xml文件中,其中有一个根元素<resource>,而具体的每种样式定义则是通过<resource>下的 ...

  5. Android的消息处理机制(Looper,Handler,Message)(转)

    Handler Handler的定义: 主要接收子线程发送的数据,并用此数据配合主线程更新UI. 当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI空间进 ...

  6. Intellij idea 12和设置快捷键修改(加快项目的开发速度与养成良好习惯)

    1.为了养成良好的代码习惯idead中的javascript jSLint能显示不良的代码设置如下    2.Intellij idea 12每一次修改,保存生成都要按ctrl+shift+F9非常影 ...

  7. Oracle数据库之创建表结构

    Oracle数据库之创建表结构 主键与外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(可以是一个属性,也可以是多个)能唯一标识一条记录,那么该属性组就是主键. 外键:关系型数 ...

  8. 类似a:hover的伪类的注解

    a:link { font-size: 14pt; text-decoration: underline; color: blue; } /*设置a对象在未被访问前的样式表属性 .*/ a:hover ...

  9. cocos2d-js 入门之碰撞

    本文由qinning199原创,转载请注明:http://www.cocos2dx.net/post/223 1.cc.rectIntersectsRect(ra,rb) 判断两个矩形是否相交,若相交 ...

  10. 转:fopen与open可以转换吗

    绝对不可以.fopen是C运行库级别的函数,而open是system call的wrapper routine.fopen返回FILE *的指针,这个结构本身维护着一些关于这个文件的信息,而open返 ...