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;
    
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。