iOS数据处理之数据库

什么是数据库?

数据库(Database)是按照数据结构来组织,存储和管理数据的仓库.

数据库分类: 关系型数据库(主流), 对象型数据库,层次式数据库

常用关系型数据库:

PC端: Oracle ,MySQL, SQL Server,Access,DB2,Sybase

嵌入式\移动客户端: SQLite

一.数据库管理系统

SQL语言叙述

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

常见的数据库

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

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

数据库特征:

1.以一定方式存储在一起

2.能为多个用户共享

3.具有尽可能少的冗余代码

4.与程序彼此独立的数据集合

二.SQL语句

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

SQLite 数据库数据类型

SQLite 是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的.

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

SQLite 字段约束条件

not null — 非空  :  必填

unique  — 唯一 : 确定的,没有其他的,该字段数据不能重复

primary key — 主键 :  包含NOT NULL ,不能为空; 不重复(一条数据的指纹就是主键)唯一标识一条数据

当把一个字段设置为 主键, 这个字段就变为必填选项(必须有值,而且不可以为空,不可以重复)

foreign key — 外键 : 可以理解成外面一张表的主键,简称外键; 联表查询时使用

check — 条件检查,确保一列中的所有值满足一定条件

default — 默认

autoincreatement  —自增型变量 : 一般会对integer 类型设置完成之后,会根据上一条数据自增

SQL 语句

1.建表命令 (Create table)

2.数据插入命令(insert)

3.数据库更新命令 (Update)

4.数据库删除命令 (Delete)

5.数据库检索命令 (Select)

建表

create table (if not exists) 表名( 字段1  约束1, 字段2  约束2 , ………..    );

字段类型一定要添

示例:

Create table  stu ( s_id integer primary , s_name text , s_age integer );

插入

insert into 表名 (字段名1, 字段名2, …..    )values (字段1值, 字段2值, ………);

注 : values值 如果是字符串或字符类型的,  需要用 ‘  ‘  括起来

更新

update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2,.....where 条件

示例:update stu set s_age = 100  where s_age = 10  and s_name = @“小明";

删除

delete from 表名 where 条件;

查询

select 要查找字段 from 表名 where 条件;

select * from stu  :  查询stu表中的所有数据

三.iOS的数据库技术实现

开始使用SQLite

1.引入头文件

2.打开数据库

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

4.关闭数据库

代码实现

DataBaseHandel.h#import@interface DataBaseHandel : NSObject//单例+(DataBaseHandel *)sharedDataBaseHandle;//打开数据库-(void)openDB;//关闭数据库-(void)closeDB;//创建表-(void)createTable;//插入一条数据-(void)insertName:(NSString*)name          gender:(NSString*)gender              age:(NSInteger)age;//通过UID更新一个数据-(void)updateWithUID:(NSInteger)uid;//通过UID删除一个数据-(void)deleteWithUID:(NSInteger)uid;//搜索全部-(void)searchAll;//根据name查询一条数据-(void)searchWithName:(NSString*)name;@end

DataBaseHandel.m#import"DataBaseHandel.h"//数据库 头文件#import@interfaceDataBaseHandel()//documents文件夹下的 一个叫做person.sqlite@property(nonatomic,copy)NSString*dbPath;@endstaticDataBaseHandel *dataBase =nil;@implementationDataBaseHandel//单例类+(DataBaseHandel *)sharedDataBaseHandle{if(dataBase ==nil) {      dataBase = [[DataBaseHandel alloc] init];      }returndataBase;}//懒加载-(NSString*)dbPath{if(_dbPath ==nil) {NSString*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];      _dbPath = [documentPathStr stringByAppendingPathComponent:@"person.sqlite"];      }return_dbPath;}//初始化一个数据库staticsqlite3 *db =nil;//打开数据库-(void)openDB{//_dbPath 是懒加载,不能用下划线//打开数据库的函数//在数据库里面,所有的字符串都要变成 utf-8的编码格式intresult = sqlite3_open(self.dbPath.UTF8String, &db);if(result == SQLITE_OK) {NSLog(@"打开成功");      }else{NSLog(@"打开失败");      }}//关闭数据库-(void)closeDB{intresult = sqlite3_close(db);if(result == SQLITE_OK) {NSLog(@"关闭成功");      }else{NSLog(@"关闭失败 %d",result);      }}//创建表-(void)createTable{//创建一个person表, 要求字段: UID integer 主键 ,自增 name text ,gender text, age integer//创建表的sql语句NSString*createString =@"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)";//第一个参数: 数据库//第二个参数: sql语句,要用UTF--8  的格式//第三个参数: 结果的回调函数//第四个参数: 回调函数的参数//第五个参数: 错误信息intresult = sqlite3_exec(db, createString.UTF8String,NULL,NULL,NULL);if(result == SQLITE_OK) {NSLog(@"创建表成功");}else{NSLog(@"创建失败 %d",result);}//打印数据库的地址NSLog(@"_dbPath === %@",_dbPath);}//插入一条数据-(void)insertName:(NSString*)namegender:(NSString*)genderage:(NSInteger)age{//插入数据的sql语句,数据不确定,所以在values里面使用 ? 代替,之后向里面绑定NSString*insertString =@"insert into person (name,gender,age) values(?,?,?)";//初始化伴随指针sqlite3_stmt *stmt =nil;//预执行sql语句//第一个参数: 数据库//第二个参数: sql语句//第三个参数: 如果为正, 例如1,表示在取参数的时候,支取一个字节; 使用负数表示取值取到 碰到结束符号 ('\000','u000'),//第四个参数:伴随指针,会伴随着数据库的操作, 获取值或绑定值//第五个参数: 取值的时候如果取得不全, 那么剩下的都存在这里intresult = sqlite3_prepare(db, insertString.UTF8String, -1, &stmt,NULL);//如果预执行成功的话,那么就要往里面方数据了if(result == SQLITE_OK) {//向预执行的sql语句里面插入参数 (取代 ? 的位置)//第一个参数: 伴随指针//第二个参数: '?'的位置,从1开始//第三个参数: 插入的数据//第四个参数: 和上面的-1 一样//第五个参数: 回调函数sqlite3_bind_text(stmt,1, name.UTF8String, -1,NULL);sqlite3_bind_text(stmt,2, gender.UTF8String, -1,NULL);sqlite3_bind_int64(stmt,3, age);//sql语句已经全了//执行伴随指针, 如果为SQLITE_DONE 代表执行成功, 并且成功的插入数据if(sqlite3_step(stmt) == SQLITE_DONE) {NSLog(@"插入成功");}else{NSLog(@"插入失败");}}else{NSLog(@"%d",result);}//一定要记得释放掉伴随指针sqlite3_finalize(stmt);}//通过UID更新一个数据-(void)updateWithUID:(NSInteger)uid{NSString*updateString =@"update person set name = '骚军' where uid = ?";sqlite3_stmt *stmt =nil;intresult = sqlite3_prepare(db, updateString.UTF8String, -1, &stmt,NULL);if(result == SQLITE_OK) {sqlite3_bind_int64(stmt,1, uid);if(sqlite3_step(stmt) == SQLITE_DONE) {NSLog(@"修改成功");}}sqlite3_finalize(stmt);}//通过UID删除一个数据//简单操作方式-(void)deleteWithUID:(NSInteger)uid{NSString*deleteSrting = [NSStringstringWithFormat:@"delete from person where uid = %ld",uid];intresult = sqlite3_exec(db, deleteSrting.UTF8String,NULL,NULL,NULL);if(result == SQLITE_OK) {NSLog(@"删除成功");}else{NSLog(@"删除失败 %d",result);}//sqlite3_finalize(stmt);}//搜索全部-(void)searchAll{//搜索语句 即使没有? 也要使用 伴随语句NSString*searchString =@" select * from person";sqlite3_stmt *stmt =nil;intresult = sqlite3_prepare(db, searchString.UTF8String, -1, &stmt,NULL);if(result == SQLITE_OK) {//当sqlie3_step(stmt) == SQLITE_ROW 的时候, 代表还有下一条数据while(sqlite3_step(stmt) == SQLITE_ROW) {//第二个参数: 表示参数的位置, 从零开始intuid = sqlite3_column_int(stmt,0);NSLog(@"uid === %d",uid);NSString*name = [NSStringstringWithUTF8String:(constchar*) sqlite3_column_text(stmt,1)];NSLog(@"name === %@",name);NSString*gender = [NSStringstringWithUTF8String:(constchar*)sqlite3_column_text(stmt,2)];NSLog(@"gender === %@",gender);intage = sqlite3_column_int(stmt,3);NSLog(@"age === %d",age);}}sqlite3_finalize(stmt);}//根据name查询一条数据-(void)searchWithName:(NSString*)name{}@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容