javaRTTIjavaRTTI12-12 05:05

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

官场书屋二维码

小额赞赏

000
评论