iOS学习36数据处理之SQLite数据库

1. 数据库管理系统

 1> SQL语言概述

  SQL: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集, 是一种功能齐全的数据库语言。

 2> 常见的数据库

  MySQL: MySQL是一个精巧的SQL数据库管理系统, 而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。 由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结果,受到了广大自由软件爱好者甚至是商业软件用户的青睐。

  Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强。

 3> 数据库特征:

  • 以一定的方式存储(表结构)

  • 能共享数据(很多人都能用)

  • 具有尽可能少的冗余代码(单表操作的代码相对而言简单,多表操作代码比较复杂)

  • 与程序彼此独立(与程序本身没有太大的关系)

 4> 数据库管理系统

  SQLite(http://www.sqlite.org/docs.html)是一个轻量级的关系数据库。 SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Window Phone等智能手机。iOS使用时SQLite,只需要加入libsqlite3.0.tbd依赖以及引入sqlite3.h头文件即可。

 5> 相关概念

  • :是数据库中一个非常重要的对象,是其他对象的基础。根据信息分类情况,一个数据库中可能包含若干个数据表。

  • 字段:表的"列"称为"字段",每个字段包含某一专题的信息

  

  • 记录:是指对应于数据表中一行信息的一组完整的相关信息。

2. SQL语句 

 1> SQLite数据库数据类型

  SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的。(注:良好的编程习惯应该要为字段标注类型

  为了使sqlite和其他数据库间的兼容性最大化,sqlite支持"类型近似"的观点,列的类型近似指的是存储在列上数据的推荐类型。

 2> SQLite近似类型规则

  • 如果类型字符串中包含"INT",那么该字段的亲缘类型为INTEGER。

  • 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型TEXT,如VARCHAR。

  • 如果类型字符串中包含"BLOB",那么该字段的亲缘类型NONE。

  • 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型REAL

  • 其余情况下,字段的亲缘类型NUMERIC

 3> SQLite字段约束条件

  • not null(非空)

   在数据库中允许除主键以为,其他的任何字段可以为空

  • unique(唯一)

   表示确定的,只有这个没有重复的

  • primary key(主键)

   不能为空(not null);

   不能重复(唯一unique);

   一个表里可以没有主键,但是如果设置完主键,必须遵守主键的特点(最好设置主键,方便我们查找相关信息)

  • foreign key(外键)

   在MySQL里面有联表查询,需要使用外键;

   作用: 可以根据外键查询另一张表的某条具体数据

  • check 该字段数据用于必须满足一定条件

  • default 该字段数据可以给定默认值

  • autoincrement(自增变量) 该字段数据如果为整型可以自动加 1

 4> SQL语句

  • 建表命令

  语法: creat table 表名(字段1 类型 约束1 约束2, 字段2 类型 约束1, ...); 

1 -- 需求:创建一个student表,表中字段有学号,姓名,年龄; 学号作为主键的约束条件,自增,不能为空; 姓名默认为'无名氏'; 年龄大于16
2 
3 create table if not exists student(s_id integer primary key autoincrement not null, s_name text default '无名氏', s_age integer check (s_age > 16));
  • 数据插入命令

  语法: insert into 表名(字段1, 字段2, 字段3, ...) values(value1, value2, value3);

1 --事例:
2 insert into student(s_name, s_age) values('ff', 18);
3 insert into student(s_name, s_age) values('zf', 24);
  • 数据更新命令

  语法: update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2 where 条件;

 1 update student set s_age = 18 where s_age = 24;                                              

  • 数据删除命令

  语法: delete from 表名 where 条件

 1 delete from student where s_age = 2;                                               

  • 数据查询命令

  语法: select 要查找的字段 from 表名 where 条件;

1 -- * 表示所有的数据
2 select * from student;
3 select * from student where s_age = 18;
4 select s_name from student where s_age = 24;

3. iOS的数据库计数的实现 

 1> SQLite导入的框架

  • Xcode 6 中 libsqlite3.0.dylib

  • Xcode 7 中 libsqlite3.0.tdb

 2> 导入相应的框架步骤:

 3> 开始使用SQLite

  • 引入<sqlite3.h>头文件

  • 打开数据库

  • 执行SQL命令(建表,增删查改)

  • 关闭数据库

 4> SQLite语法

  • 创建或打开数据库

   sqlite3_open() 将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result 等于常量 SQLITE_OK,则表示成功打开数据库。

   sqlite3 *db; db 一个打开的数据库实例。

   数据库文件的路径必须以 C语言字符串(而非NSString)传入。

 1    // 打开数据库,很多地方都会使用到数据库,所以初始化一个数据库的静态变量(句柄)
 2     static sqlite3 *db = nil; 
 3 
 4     // 打开数据库,使用int去接收打开的结果
 5     // 第一个参数:self.dbPath代表数据库的存储路径
 6     // 第二个参数:二级指针,数据库的地址(句柄)
 7     
 8     int result = sqlite3_open([self.dbPath UTF8String], &db);
 9     
10     // result是一个枚举值,有很多种情况
11     if (result == SQLITE_OK) {
12         NSLog(@"数据库打开成功");
13     } else {
14         NSLog(@"数据库打开失败");
15     }
  • 关闭数据库:sqlite3_close(db);
1     int result = sqlite3_close(db);
2     
3     if (result == SQLITE_OK) {
4         NSLog(@"数据库关闭成功");
5     } else {
6         NSLog(@"数据库关闭失败");
7     }
  • 执行sql语句

  sqlite3_exec() 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据

  • 预执行

  

  方法使用及参数说明见代码

   创建表

 1     // 创建一个Person表,字段:uid integer类型主键 自增 不能为空,name text类型,gender text类型,age integer类型
 2     NSString *createStr = @"create table if not exists person(uid integer primary key autoincrement not null, name text, gender text, age integer)";
 3     /*
 4      int SQLITE_STDCALL sqlite3_exec(
 5         sqlite3*,
 6         const char *sql,
 7         int (*callback)(void*,int,char**,char**),
 8         void *,
 9         char **errmsg
10         );
11      */
12     
13     // 第一个参数:数据库
14     // 第一个参数:sql语句,需要进行编码
15     // 第一个参数:结果回调的一个函数
16     // 第一个参数:回调函数的一个参数
17     // 第一个参数:错误信息
18     int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);
19     
20     if (result == SQLITE_OK) {
21         NSLog(@"创建表成功");
22     } else {
23         NSLog(@"创建表失败");
24     }

  插入数据

 1     // 当values不确定的情况下使用问号(?)代替,之后会进行值绑定的过程
 2     NSString *insertStr = @"insert into person(name, gender, age) values(?, ?, ?)";
 3     
 4     // 伴随指针
 5     sqlite3_stmt *stmt = NULL;
 6     
 7     // 预执行语句
 8     
 9     /*
10      int SQLITE_STDCALL sqlite3_prepare(
11         sqlite3 *db,
12         const char *zSql,
13         int nByte,
14         sqlite3_stmt **ppStmt,
15         const char **pzTail
16         );
17      */
18     // 第一个参数db:数据库
19     // 第二个参数zSql:sql语句
20     // 第三个参数nByte:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取
21     // 第四个参数pzTail:是伴随指针,需要自己进行创建,会随着数据库的相关操作确定其中问号(?)的值
22     // 第五个参数ppStmt:取值的时候取不全,剩下的值就都存在这里
23     int result = sqlite3_prepare(db, [insertStr UTF8String], -1, &stmt, NULL);
24     
25     if (result == SQLITE_OK) {
26         
27         // 操作成功的方法里进行问号(?)值的一些绑定设置
28         
29         // 第一个参数:伴随指针
30         // 第二个参数:? 的位置,从1开始
31         // 第三个参数:表示要插入的值
32         // 第四个参数:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取
33         // 第五个参数:回调函数
34         sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);
35         sqlite3_bind_text(stmt, 2, [gender UTF8String], -1, NULL);
36         sqlite3_bind_int64(stmt, 3, age);
37         
38         // sql语句执行完毕
39         // 执行伴随指针,根据伴随指针的执行情况来判断是否插入成功[SQLITE_DONE代表伴随指针执行成功]
40         if (sqlite3_step(stmt) == SQLITE_DONE) {
41             NSLog(@"插入成功");
42         } else {
43             NSLog(@"插入失败");
44         }
45         
46     } else {
47         NSLog(@"result = %d", result);
48     }
49     // 一定要释放伴随指针
50     sqlite3_finalize(stmt);

  更新数据

 1     NSString *updateStr = @"update person set name = '悟空' where uid = ?";
 2     
 3     sqlite3_stmt *stmt = NULL;
 4     
 5     int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL);
 6     
 7     if (result == SQLITE_OK) {
 8         sqlite3_bind_int64(stmt, 1, uid);
 9         
10         if (sqlite3_step(stmt) == SQLITE_DONE) {
11             NSLog(@"更新数据成功");
12         } else {
13             NSLog(@"更新数据失败");
14         }
15         
16     } else {
17         NSLog(@"result = %d", result);
18     }
19     sqlite3_finalize(stmt);

  删除数据

 1     NSString *deleteStr = @"delete from person where uid = ?";
 2     
 3     sqlite3_stmt *stmt = NULL;
 4     
 5     int result = sqlite3_prepare(db, deleteStr.UTF8String, -1, &stmt, NULL);
 6     
 7     if (result == SQLITE_OK) {
 8         sqlite3_bind_int64(stmt, 1, uid);
 9         
10         if (sqlite3_step(stmt) == SQLITE_DONE) {
11             NSLog(@"删除成功");
12         } else {
13             NSLog(@"删除失败");
14         }
15         
16     } else {
17         NSLog(@"result = %d", result);
18     }
19     sqlite3_finalize(stmt);

  查找所有数据

 1     NSString *selectStr = @"select * from person";
 2     
 3     sqlite3_stmt *stmt = NULL;
 4     
 5     int result = sqlite3_prepare(db, selectStr.UTF8String, -1, &stmt, NULL);
 6     
 7     if (result == SQLITE_OK) {
 8         // 查找数据的时候当不知道有多少次的时候使用while循环
 9         // sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据
10         while (sqlite3_step(stmt) == SQLITE_ROW) {
11             // 第一个参数:伴随指针
12             // 第二个参数:代表这个字段的位置【只有带问号的是从1开始,其余所有都是从0开始】
13             int uid = sqlite3_column_int(stmt, 0);
14             NSLog(@"uid = %d", uid);
15             
16             // 在OC代码中,要使用C语言的相关内容,应该使用utf-8
17             NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
18             NSLog(@"name = %@", name);
19             
20             NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
21             NSLog(@"gender = %@", gender);
22             
23             int age = sqlite3_column_int(stmt, 3);
24             NSLog(@"age = %d ***************", age);
25         }
26         
27     } else {
28         NSLog(@"result = %d", result);
29     }
30     sqlite3_finalize(stmt);

 

posted @ 2016-05-04 20:53  墨隐于非  阅读(652)  评论(0编辑  收藏  举报