SQLite3简介
是一款轻型的、跨平台的、嵌入式的关系型数据库
优点:占用的资源非常的低、在嵌入式设备中,只需要几百K即可,处理速度比MySQL还快
缺点:并发访问不理想,SQL标准支持不全
语言接口:C/C++、Java、Python、Ruby、Perl …
实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎
大部分数据库都是应用于服务器端,而SQLite数据库用于嵌入式终端以及移动终端。
SQLite直接访问其存储文件,即通过一个文件路径访问
如何存储数据?
数据库的存储结构和excel很像,以表(table)为单位
数据库存储数据的步骤 :
1. 新建一张表(table)
2. 添加多个字段(column、列、属性)
3. 添加多行记录(row,每行存放多个字段对应的值)
SQLite中的数据类型:
INTEGER: 整数类型,根据值的大小存储在1 2 3 4 6 8个字节中
TEXT: 字符串类型
REAL: 浮点类型,存储为8字节的IEEE浮点数字
BLOB: 二进制类型,完全根据它的输入存储
NULL: 是一个空值
注意:SQLite3本身是一个轻量级数据库,支持的数据类型比较少
标准SQL中支持很多数据类型,SQLite3将这些类型进行了归类
参考:http://www.runoob.com/sqlite/sqlite-data-types.html
SQLite3编程接口说明
SQLite3提供了纯C的开发接口
Xcode创建项目后,需要在项目中添加SQLite3的库文件:
项目配置文件 —> Build Phases —> Link Binary With Library 中添加
使用库文件中的接口,需要包含头文件<sqlite3.h>
打开/创建数据库
使用sqlite3_open函数
int sqlite3_open( const char *filename, sqlite3 **ppDb );
存在则打开,不存在则创建并打开
参数filename:sqlite3存储文件路径
参数ppDb:数据库句柄的出参
返回值:成功返回SQLITE_OK
如:
NSString * path2 = [NSString stringWithFormat:@"%@/Documents/h.sqlite", NSHomeDirectory()]; int res = sqlite3_open(path2.UTF8String, &_sql); if ( res != SQLITE_OK ) { NSLog(@"数据库打开失败!"); return ; }
另外两个open版本:16后缀的使用UTF-16编码,v2后缀的提供了额外参数
int sqlite3_open16( const void *filename, sqlite3 **ppDb ); int sqlite3_open_v2( const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
关闭数据库
int sqlite3_close(sqlite3*); int sqlite3_close_v2(sqlite3*);
如:
if ( _sql != NULL ) { sqlite3_close(_sql); _sql = NULL; }
执行SQL语句----回到函数方式
int sqlite3_exec( sqlite3 *, //数据库句柄 const char *sql, //sql语句字符串 int (*callback)(void*,int,char**,char**) //结果集的回调函数 void *, //回调函数的第一个参数 char ** //出错时的错误描述(出参) );
说明:一般而言,使用sqlite3_exec()执行没有结果集的更新操作SQL语句,如insert、delete、update
如:从t_hero表单中删除id为1001的行
NSString * path = [NSString stringWithFormat:@"delete from t_hero where id=%@;", @"1001"]; int res = sqlite3_exec(_sql, path.UTF8String, NULL, NULL, NULL); if ( res != SQLITE_OK ) { NSLog(@"%@ 执行失败 %s\n", path, sqlite3_errmsg(_sql)); }
如果有结果集,通过回调函数获得结果集,其函数类型:(很少这样使用的)
int (*callback)( void*, //sqlite3_exec的传递过来的参数 int, //结果集的行数 char**, //结果集中所有的字段名 char** //结果集中对应的字段值 );
执行SQL语句—prepare方式
select语句的执行推荐使用sqlite3_prepare_v2()函数
int sqlite3_prepare_v2( sqlite3 *db, //数据库句柄 const char * zSql, //SQL语句,UTF-8格式 int nByte, //zSql参数长度的最大值,可传-1 sqlite3_stmt **ppStmt, //结果集(出参) const char **pzTail //传NULL即可 };
返回值:成功返回SQLITE3_OK,否则返回错误码
执行后,可以获得结果集,使用sqlite3_step()遍历结果集 的每一行
int sqlite3_step(sqite3_stmt *);
每次执行一次,获得结果集中的一行数据,会更改sqlite3_stmt内部的偏移量指针
返回值:成功返回SQLITE_ROW
获得一行结果的每一个字段,使用以sqlite3_column_开头的函数完成
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 unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
完成一次查询后,一定要销毁结果集
int sqlite3_finalize(sqlite3_stmt *pStmt);
如:获得t_hero中的所有行
sqlite3_stmt *stmt; NSMutableArray * arr = [NSMutableArray array]; NSString * path = [NSString stringWithFormat:@"select * from t_hero;"]; int res = sqlite3_prepare_v2(_sql, path.UTF8String, -1, &stmt, NULL); if ( res != SQLITE_OK ) { NSLog(@"%@ 执行失败 %s\n", path, sqlite3_errmsg(_sql)); return arr; } while ( sqlite3_step(stmt) == SQLITE_ROW ) { NSMutableDictionary * dict = [NSMutableDictionary dictionary]; dict[@"id"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 0)]; dict[@"name"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 1)]; dict[@"title"] = [NSString stringWithUTF8String:(char*)sqlite3_column_text(stmt, 2)]; [arr addObject:dict]; } sqlite3_finalize(stmt);
本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1746390
原文:http://annmeng.blog.51cto.com/3321237/1746390