zoukankan      html  css  js  c++  java
  • iOS开发 数据库FMDB

    iOS开发  数据库FMDB

    1.简介

    需求作用:  如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目

    常用的数据库:

      (1)Microsoft SQL Server 2000/2008, 中小企业使用较多

      (2)Oracle 比较复杂, 大企业使用较多

      (3)Mysql数据库, 网站使用较多

      (4)sqlite:  本地数据库, 访问数据足够快, 直接访问文件

             足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了

              足够小, 系统不超过1M, 适合在移动端上使用

    2. MesaSQlite使用

    实例:  使用数据存储存储一个班上学生的信息

          学号sid  用户名username  密码password 成绩score

          1501    zhangsan      123      100

          1502    lilei         321      90

          1503    wangwu        222      80 

    (1)创建数据库 

    (2)创建数据表

    (3)设计数据表(添加多个字段/列)

    (4)数据库常用操作

      增,删,改,查

    3. SQL结构化查询语句

    SQL, Structure Query Language, 结构化查询语言, 作用就是操作数据库(创建表, 数据增删改查)

    (1)创建数据表

    create table if not exists StudentInfo(sid integer, 
    username varchar(20), 
    password varchar(20),
    score varchar(20))

    (2)插入数据

    insert into StudentInfo(sid,username,password,score) values(1501,'zhangsan','211','80')

    (3)查询数据

    <1>查询表格中所有数据 

    select * from StudentInfo;

    <2>查询指定的字段

    实例:  查询所有名字username

    select username from StudentInfo

    <3>根据指定的条件进行查询

    实例: 查找name为zhansan的所有信息

    select * from StudentInfo where username='zhangsan'

    <4>根据多个条件进行查询

    实例: 查找username为zhansan, 并且password为123的所有信息

    select * from StudentInfo where username='zhangsan' and password='123'

    <5>查询后需要排序

    a.根据score升序排列

    select * from StudentInfo order by score

    b.根据score降序
    排序

    select * from StudentInfo order by score desc

    <6>获取数据行数

    select count(*) from StudentInfo 

    (4)修改数据

    update StudentInfo set score='100'  where username='zhangsan';

    (5)删除数据

    delete from StudentInfo where sid='1503'

    4. FMDB操作数据库

    配置 

      导入FMDB文件,

      添加二进制库 libsqlite3.dylib,

      包含头文件#import "FMDatabase.h"

    #import "ViewController.h"
    
    #import "FMDatabase.h"
    
    @interface ViewController (){
        //创建数据库对象
        FMDatabase *_database;
    }
    
    @end
    //1.创建数据库
    -(void)createAndInitDatabase
    {
        //设置路径
        NSString *path=[NSString stringWithFormat:@"%@/Documents/stuInfo.sqlite",NSHomeDirectory()];
        //创建数据库(如果不存在则创建打开,如果存在则直接打开)
        _database=[[FMDatabase alloc] initWithPath:path];
        if (!_database.open) {
            NSLog(@"打开失败");
            return;
        }
        NSLog(@"打开成功");
    }
    //2.创建数据表
    -(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(@"----b=%d",b);
    }
    //3.插入数据
    -(void)insertData
    {
        int sid=1502;
        NSString *username=@"lisi";
        NSString *password=@"231";
        NSString *score=@"90";
        NSString *sql=@"insert into StudentInfo(sid,username,password,score) values(?,?,?,?)";
        //注意:?对应的每一个参数都应该是字符串,其他类型转化为字符串
        BOOL b=[_database executeUpdate:sql,[NSString stringWithFormat:@"%d",sid],username,password,score ];
        NSLog(@"=======b=%d",b);
        
    }
    //4.查询数据
    -(void)queryData
    {
        //显示所有人得信息
        NSString *sql=@"select * from StudentInfo";
        //FMResultSet 表示查询后结果集
        FMResultSet *resultSet=[_database executeQuery:sql];
        //next方法每次获取一条记录,获取不到的返回nil
        while ([resultSet next]) {
            NSLog(@"sid = %@,name =%@,pass =%@,score =%@",[resultSet stringForColumn:@"sid"],[resultSet stringForColumn:@"username"],[resultSet stringForColumn:@"password"],[resultSet stringForColumn:@"score"]);
        }
        
    }
    //5.修改数据
    -(void)setData
    {
       
        NSString *username=@"lisi";
        NSString *score=@"70";
        NSString *sql=@"update StudentInfo set score='60'  where username='lisi';";
        BOOL b=[_database executeUpdate:sql,username,score ];
        NSLog(@"++++++b=%d",b);
    
    }
    //6.删除数据
    -(void)deleteData
    {
        NSString *sid=@"1501";
        NSString *sql=@"delete from StudentInfo where sid='1501'";
        BOOL b=[_database executeUpdate:sql,sid];
        NSLog(@"*******b=%d",b);
    }

    5. 数据库在项目中使用-单例设计模式

    1.首先导入FMDB文件和data.sqlite

    2.添加二进制库 libsqlite3.dylib,包含头文件#import "FMDatabase.h"

    3.创建一个FirstLevelModel模型,在FirstLevelModel.h里面自己定义属性,导入单例

    #import <Foundation/Foundation.h>
    #import "FirstLevelModel.h"
    
    @interface DatabaseManager : NSObject
    
    //获取单例对象
    +(id)sharedInstance;
    
    //获取第一级目录
    -(NSArray *)firstLevels;
    #import "DatabaseManager.h"
    #import "FMDatabase.h"
    
    @interface DatabaseManager()
    {
        FMDatabase *_database;
    }
    
    @end
    
    @implementation DatabaseManager
    
    //获取单例对象
    +(id)sharedInstance
    {
        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 *marr=[[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"];
            
            [marr addObject:model];
        }
        
        return marr;
        
    }

     自己做了一个简单“交通考试”的实例

    效果图:

    实现代码:点我下载

  • 相关阅读:
    android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
    Android ViewPager使用详解
    android背景选择器selector用法汇总
    GSON
    Android View事件机制 21问21答
    Android Drawable的9种子类 介绍
    Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager
    提取页面共性用抽象类来写页面模板
    对SharePreference的封装
    Android 主题和选择器
  • 原文地址:https://www.cnblogs.com/DWdan/p/4390504.html
Copyright © 2011-2022 走看看