###一、 SQLite基本概述html
SQLite,是一款轻型的数据库,是遵照ACID的关系型数据库管理系统,它包含在一个相对小的C库中。git
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。github
SQLite占用资源很是的低,只须要几百K的内存就够了。因此移动端和嵌入式设备的数据存多使用SQLite。sql
SQLite可以支持Windows/Linux/Unix等等主流的操做系统,支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python, Ruby等。SQLite虽然很小巧,可是支持的SQL语句不会逊色于其余开源数据库,当前使用版本为SQLite3。数据库
SQLite引擎不是个程序与之通讯的独立进程,而是链接到程序中成为它的一个主要部分。因此主要的通讯协议是在编程语言内的直接API调用。编程
###二、 导入SQLite系统库和SQLiteManger下载 iOS中使用SQLite得依赖 libsqlite3.dylib 库,因此使用前先要导入这个库。步骤以下:数组
点击项目文件 -> TARGETS -> Build Phases -> Link Binary With Librarise -> 点击 + 号,XCode7之后不能直接搜索到libsqlite3.dylib,只能搜到libsqlite3.tbd,须要到指定目录中添加,因此须要以下图操做:app
一、点击Add Other编程语言
二、快捷键 command + shift + G 前往文件夹,输入/user/lib/libsqlite3.dylib 到达库文件目录。函数
三、选择libsqlite3.dylib ,OK了。
为了提升使用SQLite的效率,一般咱们要结合一个可视化Mac端的SQLite软件 SQLiteManager 一块儿完成,以下软件界面:
###三、 SQLite经常使用结构体\函数解析 SQLite提供是C语言的库,使用的时候调用的API都是函数,这些经常使用的函数包括数据库的建立打开、语句的预处理、执行、关闭等。
sqlite3
: 数据库结构体,至关于数据库类。
sqlite3_stmt
: sql语句结构体,至关于SQL语句类。
sqlite3_open()
: 建立和打开数据库,返回值等于 SQLITE_OK 表示成功。
sqlite3_exec()
: 执行非查询sql语句,返回值等于 SQLITE_OK 表示执行成功。
sqlite3_prepare_v2()
: 预处理sql语句,用于数据查询。
sqlite3_step()
: 能够用于屡次执行sql语句,要先使用预处理,用于数据查询。
sqlite3_bind_text()
: 绑定sql语句中 ?号对应的参数。
sqlite3_column_text()
: 从sqlite3_step()的结果中获取指定列的数据,包含 int,double等多个。
sqlite3_finalize()
:销毁前面被sqlite3_prepare()建立的预处理语句sqlite3_stmt,在关闭以前完成。
sqlite3_close()
:关闭以前打开的数据库,使用完后必须关闭数据库释放资源。
###四、 建立数据库
// 一、建立数据库指针,至关于建立一个数据库对象。 sqlite3 *_sqlDB; // 二、建立数据库保存的路径 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *dataPath = [docPath stringByAppendingFormat:@"/%@.sqlite",dbName]; // 三、打开数据库 int result = sqlite3_open([dataPath UTF8String], &_sqlDB); if (result == SQLITE_OK) { NSLog(@"建立/打开成功!"); } else { NSLog(@"建立/打开失败!"); // 四、关闭数据库 sqlite3_close(_sqlDB); }
代码解析:
一、数据库扩展名称为.sqlite
二、sqlite3_open()函数包含两个参数,第一个为数据库的路径由于参数的类型是 char *类型,全部要用[dataPath UTF8String]进行类型转换,第二个为数据库sqlite3指针的地址。
三、若是函数的返回值等于 SQLITE_OK(宏) 表示成功。
四、数据库打开失败或者使用完后都要调用sqlite3_close()函数,关闭数据库释放资源。
###五、 建立数据库表
// 一、建立建立表的 SQL 语句 NSString *sql = @"CREATE TABLE IF NOT EXISTS Person(pID TEXT PRIMARY KEY,pName TEXT,pSex TEXT, pTel TEXT)"; // 二、执行语句SQL语句 char *error; int result = sqlite3_exec(_sqlDB, [sql UTF8String], NULL, NULL, &error); if (result == SQLITE_OK) { NSLog(@"建立表成功!"); } else { NSLog(@"建立表失败!"); sqlite3_close(_sqlDB); }
代码解析:
一、sql语句:**CREATE TABLE IF NOT EXISTS 表名(字段1 数据类型,字段2 数据类型...(还能够设置字段为主键、外键等))"
**表示建立一个名称为Person的表,表包含pID、pName、pSex、pTel四个字段,主键(PRIMARY KEY)为pID,TEXT为字段的数据类型表示字符串类型,IF NOT EXISTS表示没有这个表时再建立有了就不建立了。
二、sqlite3_exec()执行sql语句函数,包含五个参数,第一个是数据库指针,第二个sql语句(char * 类型),第三个回调函数,若是不须要回调就用NULL。第四个回调函数的的第一个参数没有用NULL,第五个错误信息地址 char **类型。
###六、 添加数据到表
// 一、建立给表添加数据的sql语句 NSString *pID = @"1002"; NSString *pName = @"kitty"; NSString *pSex = @"女"; NSString *pTel = @"98777331"; NSString *sql_insert = [NSString stringWithFormat:@"INSERT INTO Person (pID,pName,pSex,pTel) VALUES ('%@','%@','%@','%@')",pID,pName,pSex,pTel]; //二、执行 sql 语句 char *error; int result = sqlite3_exec(_sqlDB, [sql_insert UTF8String], NULL, NULL,&error); if (result == SQLITE_OK) { NSLog(@"数据插入成功!"); } else { NSLog(@"数据插入失败!"); }
代码解析:
一、sql语句:**INSERT INTO Person (字段1,字段2...) VALUES (数据1,数据2...)"
**表示在Person表里的 pID,pName,pSex,pTel 字段中,分别插入对应的值。
二、也sqlite3_exec()执行sql语句,非查询的sql语句都用这个函数执行。
###七、给数据库表添加字段(列)
//一、在标准添加字段的 sql 语句 NSString *culumn = @"pAge INTEGER"; NSString *sql_addCulumn = [NSString stringWithFormat:@"ALTER TABLE Person ADD COLUMN %@ ",culumn]; //二、执行 sql 语句 char *error; int result = sqlite3_exec(_sqlDB, [sql_addCulumn UTF8String], NULL, NULL,&error); if (result == SQLITE_OK) { NSLog(@"添加字段成功!"); } else { NSLog(@"添加字段成功!"); }
代码解析:
一、sql语句:ALTER TABLE 表名 ADD COLUMN 列名称和数据类型
,表示在Person表格中添加一个字段(一列),这一列名称叫作 pAge数据类型为 interger。
二、执行函数也使用sqlite3_exec()
###七、 更新数据
// 一、建立跟新数据的 sql 语句 NSString *sql_update = [NSString stringWithFormat:@"UPDATE Person SET pAge = %d WHERE pName = 'kitty'",20]; // 二、执行 sql 语句 char *error; int result = sqlite3_exec(_sqlDB, [sql_update UTF8String], NULL, NULL,&error); if (result == SQLITE_OK) { NSLog(@"数据更新成功!"); } else { NSLog(@"数据更新失败!"); }
代码解析:
一、sql语句:UPDATE 表名 SET 须要修改的数据 WHERE 条件
,表示更新Person表格,将pName为‘kitty’的这些行的 pAge 改成 20。WHERE后面的表示更改的条件。
###八、 删除数据
// 一、建立 sql 语句 NSString *sql_Delete = [NSString stringWithFormat:@"DELETE FROM Person WHERE pName = '%@'",@"kitty"]; //二、执行 sql 语句 char *error; int result = sqlite3_exec(_sqlDB, [sql UTF8String], NULL, NULL,&error); if (result == SQLITE_OK) { NSLog(@"数据删除成功!"); } else { NSLog(@"数据删除失败!"); }
代码解析:
一、sql语句:DELETE FROM 表名 WHERE 条件"
,表示从Person 表中删除pName为‘kitty‘的全部行。
###九、 查询数据
// 一、建立保存查询结果的数组 NSMutableArray *perObjs = [NSMutableArray array]; // 二、建立查询的 sql 语句 NSString *sql_Select = [NSString stringWithFormat:@"SELECT * FROM Person WHERE pAge > %d",20]; // 三、建立sql语句指针,至关于建立查询语句对象 sqlite3_stmt *stmt; // 四、预处理SQL语句,至关于编译 sql 过程 int result = sqlite3_prepare_v2(_sqlDB, [sql UTF8String], -1, &stmt, NULL); if(result == SQLITE_OK) { // 五、执行SQL语句 while (sqlite3_step(stmt) == SQLITE_ROW) { // 六、获取对应的字段数据 char *ID = (char *)sqlite3_column_text(stmt, 0); char *name = (char *)sqlite3_column_text(stmt, 1); char *sex = (char *)sqlite3_column_text(stmt, 2); char *tel = (char *)sqlite3_column_text(stmt, 3); int age = sqlite3_column_int(stmt, 4); // 七、将数据保存到数据mode中 Person *per = [[Person alloc] init]; per.pID = [NSString stringWithUTF8String:ID]; per.pName = [NSString stringWithUTF8String:name]; per.pSex = [NSString stringWithUTF8String:sex]; per.pTel = [NSString stringWithUTF8String:tel]; per.pAge = age; // 八、将查询的结果保存在数组中 [perObjs addObject:per]; } } else { sqlite3_close(_sqlDB); NSLog(@"查询数据失败!"); } // 九、释放stmt sqlite3_finalize(stmt);
代码解析:
一、sql语句:SELECT * FROM 表名 WHERE 查询条件
,表示从Person表格中查询pAge大于20的全部行。
二、sqlite3_stmt 至关于sql语句的对象,执行语句、获取查询到的取都是对这个对象进行操做。
三、sqlite3_prepare_v2(),sql语句预处理操做,在执行语句前作的事至关于编译 sql 语句。包含五个参数,第一个数据库指针,第二个sql语句,第三个能从sql语句中获取的最大字节数,使用-1表示整个sql语句。第四个sqlite3_stmt对象地址,第五个指向未使用部分的 sql 语句的指针,若是为前面为-1就使用NULL。
四、sqlite3_step(),执行 sql 语句,将编译好的sql语句执行,这个函数可能会屡次执行,由于查询的数据可能有多条,全部要一个循环语句一块儿使用。循环条件是sqlite3_step(stmt) == SQLITE_ROW 表示还有其余行数据。
五、sqlite3_column_text(stmt, 0),获取查询到的一行结果中对应列的数据,text表示字符串类型 返回char *类型,0表示获取第0列的数据。这个函数还有int、double等类型,返回值得类型也对应。选择列对应的数据类型的函数。
六、使用数据库查询到的数据一般要保存到 mode层中,方便使用,全部建立了一个Person对象保存对应的数据。
七、sqlite3_finalize(),使用完查询对象后要释放。
###十、Demo下载地址
####连接地址:https://github.com/fuqinglin/SQLDemos.git
####SQLite SQL语句学习:http://www.runoob.com/sqlite/sqlite-tutorial.html