IOS开发之数据库FMDB
IOS开发之数据库FMDB
1.简介
需求作用:如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目
常用的数据库:
(1)Microsoft SQL Server 2000/2008:中小企业使用较多
(2)Oracle:比较复杂, 大企业使用较多
(3)Mysql数据库:网站使用较多
(4)sqlite:本地数据库, 访问数据足够快, 直接访问文件
足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了
足够小, 系统不超过1M, 适合在移动端上使用
2. MesaSQlite使用
实例:使用数据存储存储一个班上学生的信息
(1)创建数据库
(2)创建数据表
(3)设计数据表(添加多个字段/列)
(4)数据库常用操作:增,删,改,查
3. SQL结构化查询语句
SQL, Structure Query Language, 结构化查询语言, 作用就是操作数据库(创建表, 数据增删改查)
简单基本的sql语句
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like ‘%字段值%‘ order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select top 10 * from 数据表 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in (‘值1‘,‘值2‘,‘值3‘)"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
(3) 删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值
COUNT(*;字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
//set rs=conn.excute(sql)
用 rs("别名") 获取统计的值,其它函数运用同上。
查询去除重复值:select distinct * from table1
(6) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
4. FMDB操作数据库
(1)配置
<1>导入文件,
<2>添加二进制库 libsqlite3.dylib,
<3>包含头文件#import "FMDatabase.h".
(2)使用
// // ViewController.m // FMDBUseDemo // // Created by qf on 15-4-3. // Copyright (c) 2015年 lirunmin. All rights reserved. // #import "ViewController.h" #import "FMDatabase.h" @interface ViewController () { FMDatabase *_database; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //存储学生信息 //(1)创建数据库 [self createAndInitDatabase]; //(2)创建数据表 [self createTable]; //(3)插入数据 // [self insertData]; //(4)查询数据 [self queryData]; //(5)修改和删除数据(参考插入数据) [self alterData]; // [self deleteData]; } -(void)alterData { NSString *username = @"laosiji"; NSString *score = @"88"; NSString *sql = @"update StudentInfo set username = ? where score = ?"; BOOL b = [_database executeUpdate:sql,username,score]; NSLog(@"alter b = %d",b); } -(void)deleteData { NSString *username = @"zhangsan"; NSString *sql = @"delete from StudentInfo where username = ?"; BOOL b = [_database executeUpdate:sql,username]; NSLog(@"delete b = %d",b); } -(void)queryData { //显示所有人的信息 NSString *sql = @"select * from StudentInfo"; //FMResultSet 表示查询后结果集 FMResultSet *resultSet = [_database executeQuery:sql]; //next方法每次获取一条记录,获取不到返回nil while ([resultSet next]) { NSLog(@"sid = %@,username = %@,password = %@,score = %@",[resultSet stringForColumn:@"sid"],[resultSet stringForColumn:@"username"],[resultSet stringForColumn:@"password"],[resultSet stringForColumn:@"score"]); } } -(void)insertData { int sid = 1501; NSString *username = @"zhangyi"; NSString *password = @"123444"; NSString *score = @"88"; NSString *sql = @"insert into StudentInfo(sid,username,password,score)values(?,?,?,?)"; //?对应的每一个参数都应该是字符串,其他类型转化为字符串 BOOL b = [_database executeUpdate:sql,[NSString stringWithFormat:@"%d",sid],username,password,score]; NSLog(@"insert b = %d",b); } -(void)createTable { NSString *sql = @"create table if not exists " "StudentInfo(sid integer," "username varchar(20)," "password varchar(20)," "score varchar(20));"; //executeQuery用来执行select语句 //其他语句使用executeUpdate BOOL b = [_database executeUpdate:sql]; NSLog(@"create b = %d",b); } //IOS安全机制 - 沙盒 //(1).每个应用内容都放在一个沙盒目录下面 //(2).每个应用只能修改自己沙盒目录下的文件,其他应用文件无法修改 //(3).默认文件夹 Documents,Library,tmp //开发:自己创建的文件放在Documents下面 //确定文件位置 //当前应用文件夹 NSHomeDirectory() // -(void)createAndInitDatabase { //设置路径 NSString *path = [NSString stringWithFormat:@"%@/Documents/stuInfo.sqlite",NSHomeDirectory()]; //创建数据库(如果不存在则创建再打开,如果存在则立即打开) _database = [[FMDatabase alloc] initWithPath:path]; if(!_database.open) { NSLog(@"打开失败"); return; } NSLog(@"打开成功"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
5. 数据库在项目中使用-单例设计模式
DatabaseManager.h
// // DatabaseManager.h // TrafficRulesProject // // Created by qf on 15-4-3. // Copyright (c) 2015年 lirunmin. All rights reserved. // #import <Foundation/Foundation.h> #import "FirstLevelModel.h" @interface DatabaseManager : NSObject //获取单例对象 +(id)shareInstance; //获取第一级目录 -(NSArray *)firstLevels; @end
DatabaseManager.m
// // DatabaseManager.m // TrafficRulesProject // // Created by qf on 15-4-3. // Copyright (c) 2015年 lirunmin. All rights reserved. // #import "DatabaseManager.h" #import "FMDatabase.h" @interface DatabaseManager() { FMDatabase *_database; } @end @implementation DatabaseManager +(id)shareInstance { static DatabaseManager *dc = nil; if(dc == nil) { dc = [[[self class] alloc] init]; } return dc; } -(id)init { if(self = [super init]) { [self openDatabase]; } return self; } -(void)openDatabase { NSString *path = [[NSBundle mainBundle] pathForResource:@"data.sqlite" ofType:nil]; _database = [[FMDatabase alloc] initWithPath:path]; if(!_database.open) { NSLog(@"打开失败"); } } -(NSArray *)firstLevels { NSString *sql = @"select * from firstlevel"; FMResultSet *resultSet = [_database executeQuery:sql]; NSMutableArray *muarr = [[NSMutableArray alloc] init]; while ([resultSet next]) { FirstLevelModel *model = [[FirstLevelModel alloc] init]; model.pid = [resultSet stringForColumn:@"pid"]; model.pname = [resultSet stringForColumn:@"pname"]; model.pcount = [resultSet stringForColumn:@"pcount"]; [muarr addObject:model]; } return muarr; } @end
ViewController.m
#import "ViewController.h" #import "FMDatabase.h" #import "DatabaseManager.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate> { UITableView *_tableView; NSMutableArray *_dataArr; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _dataArr = [[NSMutableArray alloc] init]; DatabaseManager *manager = [DatabaseManager shareInstance]; for(FirstLevelModel *model in manager.firstLevels) { [_dataArr addObject:model]; } _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.dataSource = self; _tableView.delegate = self; [self.view addSubview:_tableView]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _dataArr.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *identifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } FirstLevelModel *model = [_dataArr objectAtIndex:indexPath.row]; cell.textLabel.text = model.pname; return cell; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。