• 数据存储--sqlite总结


    SQLite

    SQLite(轻量级的数据库,关系型数据库)

    辅助工具:Navicat Premium 等

    原理:ios针对存储问题封装了sqlite数据库(c语言数据库).

    1 app获取沙盒地址命名数据库文件名  创建数据库

    2 执行sq语句,创建数据表

    3 执行sq语句,从而进行数据表的增删改查操作。

    ps:FMDB基于sqlite3封装了的oc库,是c方法变为oc方法,方便调用,方法参数可以接收sq语句,使之更加灵活。

    一:创建数据表(不是数据库哦)  及数据类型

    --------------------------------------------------------

    --------------------------------------------------------

    二:删除数据表

    --------------------------------------------------------

    三:插入数据 (增)

    --------------------------------------------------------

    四:更新数据 (改)

    --------------------------------------------------------

    五:删除数据 (删) 及条件语句)

    --------------------------------------------------------

    --------------------------------------------------------

    六:查询语句 (查)

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    七:主键/外键

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    --------------------------------------------------------

    INSERT UPDATE DELETE(前三个是数据操作指令) SELETE(数据查询指令)   

    //英译:insex:索引 query:问题 backup:备份 Refresh:刷新 gender:性别 triggers:触发器 select:查询 avg:平均值 limit:限制 increment:增加 design:设置

    数据表命名:通常前缀为"T_"

    // 1: INSERT 新增语句(增)

    INSERT INTO T_Person(name,age,gender,height)VALUES('王老头',60,1,165);

    SQLite语句字符串用''引起

    // 2: UPDATE 更新数据库内容(改)

        //AND设置与条件 OR设置或条件

    UPDATE T_Person SET name='王老五';

    UPDATE T_Person SET name='小芳' WHERE gender=1;

    UPDATE T_Person SET name='小芳',age=45 WHERE gender=1 AND height=1.65;

    // 3: DELETE 删除表记录(删)

    DELETE FROM T_Person;//删除表

    DELETE FROM T_Person WHERE height=1.8;

    // 4: SELECT 查询指令

    SELECT *FROM T_Person;//查询数据表

    SELECT *FROM T_Person WHERE gender=1;

    SELECT *FROM T_Person WHERE age>10 AND gender=0;

    SELECT count(*) FROM T_Person;//查询总数

    SELECT max(height) FROM T_Person;

    SELECT min(age) FROM T_Person;

    SELECT avg(height) FROM T_Person WHERE gender=0;

       //分页查询,从第几行查询,一共查几行

    SELECT *FROM T_Person LIMIT 0,3;

       //排序  ASC:升序 DESC:降序

    SELECT height,name,gender,age FROM T_Person ORDER BY age ASC,height DESC;

    //主键:唯一标示一条记录

    -----------------------------------------

    "----IOS下使用sqlite3"

    在ios中使用SQLite3:需要导入库文件:libsqlit.dylib并添加库的头文件:<sqlite3.h>

    //英译: handle:句柄  execute:执行 exist:存在 male:男性的 female:女性的 column:列 prepare:准备 predicate:谓词

    //char *将nsstring utf8即可

    //回调:某个函数执行完成后,调用的函数

    步骤:

    1 建立程序与与数据库交互的服务层(Services)

    2 单例实现服务层对象

    3 重写服务层的init方法,软加载打开数据库

    4 实现打开数据库方法

    5 沙盒新建空数据库

    6 根据是否返回"SQLITE_OK",判断sqlite3_open打开数据库成否(先设置全局数据库句柄,参数:转码数据库,句柄地址)

    7 根据是否返回"SQLITE_OK",判断sqlite_exec执行sql语句成否(参数:数据库句柄,传入的转码执行的sql语句,NULL,NULL)

    8 创建数据表(就是定义sql语句GREATE TABLE,抄的),执行sql语句看建表是否成功

    9 根据INSERT INTO添加模型属性,实现添加用户到数据库,执行sql语句看添加用户是否成功

    9 根据是否返回"SQLITE_OK",判断sqlite3_prepare_v2查询数据库是否成功(设置查询句柄,参数:数据库句柄,要查询的转码sql语句,查询句柄地址),根据是否返回@"SQLITE_ROW"判断利用查询句柄依次查询每一行sqlite3_step是否成功,取到每行信息,在查询没每列信息(怎么找到列,是根据字段顺序),将每次查询的各个字段依次赋值到模型的各个属性,将每次产生的模型依次装进可变数组,以便供视图展示使用.

    10 模糊查询操作,建立UISearchBar,实现代理方法,通过传入name做模糊查询

    NSString->const char * [str UTF8String]

    c语言中空为 NULL,打印字符用%s

    /*1:打开数据库(sqlite3_open参数:数据库名,句柄)

        --沙盒中创建**.db数据库,创建sqlite3 *_db句柄->实现sqlite3_open方法参数:数据库文件名(UTF8转码),句柄(**写地址)->方法的返回值是int,判断是否等于SQLITE OK 成功为打开成功,反之失败

      2:创建数据表

        --NSString *sql=@"根据cat自动生成的代码修改",执行SQL语句,看看成功与否

      3:执行SQL语句(sqlite3_exec参数:句柄,sql语句,null,null,错误地址)

        --判断是否返回SQLITE_OK,来判断数据表是否创建成功

     1 static sqlite3 *_db;
     2 + (void)initialize
     3 {
     4     
     5     // 0.获取沙盒地址
     6     NSString *docPth = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
     7     NSString *filePath = [docPth stringByAppendingPathComponent:@"student.sqlite"];
     8     // 1.创建数据库(使用open方法, 如果数据库文件不存储会自动创建并打开数据库, 如果数据文件存储仅仅打开数据)
     9     int result = sqlite3_open(filePath.UTF8String, &_db);
    10     if (result == SQLITE_OK) {
    11         NSLog(@"打开成功");
    12         
    13         // 1.1创建表添加字段
    14         char *sql = "CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT,  name TEXT, score REAL);";
    15         char *error;
    16         sqlite3_exec(_db, sql, NULL, NULL, &error);
    17         if (error) {
    18             NSLog(@"创建表失败");
    19         }else
    20         {
    21             NSLog(@"创建表成功");
    22         }
    23     }else
    24     {
    25         NSLog(@"打开失败");
    26     }
    27 
    28 }

      4:增加用户(增)

        --创建要添加(INSERT INTO)的sql语句,执行sql语句,看成功与否

    - (IBAction)insertBtnClick {
     for (int i = 0; i < 100; i++) {
            NSString *name = [NSString stringWithFormat:@"Jonathan - %d", i];
            int score = arc4random_uniform(100);
            
            CZStudent *stu = [[CZStudent  alloc] init];
            stu.name = name;
            stu.score = score;
            BOOL result = [CZStudentTool addStudent:stu];
            
            if (result) {
                NSLog(@"插入成功");
            }else
            {
                NSLog(@"插入失败");
            }
        }
       
       
    
    }
    //插入数据
    + (BOOL)addStudent:(CZStudent *)stu
    {
    
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(name, score) VALUES('%@', %.1f);", stu.name, stu.score];
        
        char *error;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
        if (error) {
    //        NSLog(@"插入失败");
            return NO;
        }else
        {
    //        NSLog(@"插入成功");
            return YES;
        }
        
        return NO; 
    }

      5:更新用户(改)

      6:删除用户(删)

      7:查询用户(查)

    //查询数据
    + (NSArray *)students
    {
        NSMutableArray *models = nil;
        
        char *sql = "SELECT id, name, score FROM t_student;";
        
        sqlite3_stmt *stmt;// 保存查询到的数据
        // 第三个参数是sql语句字符串的长度,只要写一个小于0的数, 系统会自动计算
        // sqlite3_prepare_v2准备查询, (检测是否有语法错误)
        int result =sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
        // 判断是否准备成功
        if (SQLITE_OK == result) {
            NSLog(@"查询成功");
            models = [NSMutableArray array];
            
            // 提取查询到的数据
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                int ID = sqlite3_column_int(stmt, 0);
                const unsigned char *name = sqlite3_column_text(stmt, 1);
                double score = sqlite3_column_double(stmt, 2);
    //            NSLog(@"%d %s %.1f", ID, name, score);
                
                CZStudent *stu = [CZStudent alloc];
                stu.ID = ID;
                stu.name = [NSString stringWithUTF8String:name];
                stu.score = score;
                
                [models addObject:stu];
            }
            
        }else
        {
            NSLog(@"查询失败");
        }
        
        return models;
    
    }

        --创建要查询的语句(SELECT FROM),判断是否返回SQLITE OK,检查语法是否正确(sqlite3_prepare_v2)参数:句柄,查询语句,byte(-1),查询句柄地址(根据此句柄依次获得查询记录)->根据句柄依次查询每行记录->查询成功返回SQLITE ROW->逐一获取每一列信息

     if(SQLITE_ROW == sqlite3_step(stmt))

     int ID = sqlite3_column_int(stmt, 0);//0为顺序

     */

    //设计模式(MVC)

    Controller->View

    |

    Model(Plist/SQLite3)

    |

    Services(服务层)

    |

    DB/Plist

    //UISearchBar坚挺文本交互信息

    textDidChange

    //模糊查询 LIKE %%%@%%

    //SQLite的dynamic libaray not found!的解决办法

    打开终端

    输入 cd Desktop,进入桌面

    输入 sqlite3 my.db

    会进入sqlite3的命令行

    输入 .tables,可以创建my.db数据库文件

    输入.quit,退出sqlite3的命令行

    然后再Navicat中,选择现有数据库,并选择刚刚创建的数据库文件即可.

  • 相关阅读:
    汉诺塔
    破损的键盘
    解方程
    运输计划
    选学霸
    子集和的目标值
    棋盘染色2
    守卫者的挑战
    飞扬的小鸟
    攻克城堡
  • 原文地址:https://www.cnblogs.com/ly1973/p/5394389.html
Copyright © 2020-2023  润新知