iOS数据持久化——SQLite(数据库)

###一、 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

相关文章
相关标签/搜索