本文整理自网络,侵删。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有14个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
SQLite的特性
1. ACID事务
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability). 原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。一致性指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
2. 零配置 – 无需安装和管理配置
3.储存在单一磁盘文件中的一个完整的数据库
4.数据库文件可以在不同字节顺序的机器间自由的共享
5.支持数据库大小至2TB
6. 足够小, 大致13万行C代码, 4.43M
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单, 轻松的API
9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立,没有额外依赖
12. 源码完全的开源, 你可以用于任何用途, 包括出售它
13. 支持多种开发语言,C, PHP, Perl, Java, C#,Python, Ruby
SQLite在iOS中的基本使用
在iOS开发中可以用一些SQLite数据库管理工具,例如SQLiteManager。
接下来就通过代码来讲述iOS中如何使用sqlite
sqlite.h文件的引入
首先是打开和关闭数据库,打开和创建数据库都是sqlite3_open函数,如果filename已经创建那就是打开。
NSString *filename;//数据库文件路径 sqlite3 *database; //sqlite3数据库句柄的指针 //打开数据库 - (int) open{ int rc=sqlite3_open([filename UTF8String], &database); if (rc) { sqlite3_close(database); NSLog(@"open database failed"); } return rc; } //关闭数据库 - (void) close{ if (database!=NULL) { sqlite3_close(database); } } 接下来插入、删除、更新都是用sqlite3_exec函数,记住执行语句,必须要先打开数据库,完成之后需要关闭数据库。 //执行 insert,update,delete 等非查询SQL语句 - (int)executeNonQuery:(NSString *)sql error:(NSError **)error { int rc; char *errmsg; rc = [self open]; if (rc) { //错误处理 if (error != NULL) { NSDictionary *eDict = [NSDictionary dictionaryWithObject:@"open database failed" forKey:NSLocalizedDescriptionKey]; *error = [NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict]; } return rc; } rc = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errmsg); if (rc != SQLITE_OK) { if (error != NULL) { NSDictionary *eDict = [NSDictionary dictionaryWithObject:@"exec sql error" forKey:NSLocalizedDescriptionKey]; *error = [NSError errorWithDomain:kSqliteErrorDomain code:rc userInfo:eDict]; } NSLog(@"%s", errmsg); sqlite3_free(errmsg); } [self close]; return rc; }
上面函数中sqlite3_free就是释放存放错误信息的内存空间。查询操作会略显复杂,同样需要有开关数据库的操作,不过有一个准备结果集和最后释放结果集的操作,分别是sqlite3_prepare_v2和sqlite3_finalize,sqlite3_stmt就是结果集,下面就是具体操作。
[self open]; // 查 strsql = "select * from users"; // SQLITE_API int sqlite3_prepare_v2( // sqlite3 *db, /* Database handle */ // const char *zSql, /* SQL statement*/ // int nByte, /* 结果集的最大长度。*/ // sqlite3_stmt **ppStmt, /* OUT: 结果集 */ // const char **pzTail /* OUT:指向结果集没有用到的内存部分的指针。 */ // ); sqlite3_stmt* rc;//陈述式句柄 if (sqlite3_prepare_v2(db, strsql, -1, &rc, NULL)!=SQLITE_OK) { } // sqlite3_step讲结果集数据指针指向下一个元素。 // 这个函数的返回值如果是SQLITE_ROW就表示我们的结果集里面有数据。 // 否则我们的结果集就是空的。 while (sqlite3_step(rc)==SQLITE_ROW) { // sqlite3_column系列函数。一般有两个输入参数。第一个是结果集指针,第二是数据所在列的序号。 // 比如我们现在用的sqlite3_column_int和sqlite3_column_text。 printf("id:%d | username:%s | password:%s \n",sqlite3_column_int(rc, 0),sqlite3_column_text(rc, 1),sqlite3_column_text(rc, 2)); } // 查完后一定要释放结果集。 sqlite3_finalize(rc); [self close];
数据库加密
相关阅读 >>
android开发之contentprovider的使用详解
mssql和Sqlite中关于if not exists 的写法
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。