美文网首页
3.1 数据持久化(存储)---数据存储(FMDBDemo)

3.1 数据持久化(存储)---数据存储(FMDBDemo)

作者: 草根小强 | 来源:发表于2019-04-19 14:47 被阅读0次

    数据持久化(存储)---数据存储

    数据存储几种方式

    1: 归档 重点 必会 常用于自动登录
    2: NSdifault 本质就是(plist)文件

    //沙盒路径:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
    
    
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/data.db"];
    

    3: 写文件
    4: 数据库 FMDBDemo

    第一步: 导入库中 
    第二步: 这时会有39个错误    这是我们要点击工程的蓝色标记  选择Bulid Phasses    选择第三项的LInK 选项  点击左边的下拉框, 选择下面的加号,搜索sql这个字符,把libsglite3这个字符添加到工程中就可以
    
    
        // 对于一些复杂的数据, 我们一般情况下用数据库来存储
        // 在移动开发中, 数据库用sqlite
        
        // FMDB 是一个第三方库, 用来方便我们对sqlite数据库进行操作
        // 数据库是用来存储一系列的复杂的数据的, 这些数据以键值的形式, 存在"表"中, 数据库中可以有无数张表
    

    warning 创建和建表的顺序是不能过颠倒的 先建数据库,再建表才可以, 增,删,改,查 顺序是可以随便的 但也要注意程序 是一步步执行的

    warning 当这个数据库还没有打开 就不能进行增、删、改、 可以进行查 但查出来的东西是空的 什么都没有

    #warning FMDB 不方便去存储头像 和大文件   我们可以把头像或者大文件存到本地,然后把路径存到数据库中
    
    /**创建数据库*/
    - (void)createDataBase{
    #warning  当这个数据库还没有打开 就不能进行增、删、改、 可以进行查 但查出来的东西是空的  什么都没有   所以 我们要进行
        // 取数组的第0个元素 最好用  fristObject 因为不会蹦   没有元素就是nil
        //数据库用.db结尾  命名规范
        //获取数据
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/data.db"];
        NSLog(@"%@",path);
        //在这个路径下如果有一个数据库,就直接读取这个数据库
        
        //如果这个路径,没有数据库,那么就去新建一个数据库
        
        self.dataBase = [[FMDatabase alloc] initWithPath:path];
        
        //我们要对一个数据库进行操作,必须先要打开这个数据
        //如果一个数据库能打开,就说明创建成功
        // 打开 用open     关闭用close
        if ([self.dataBase open]) {
            NSLog(@"创建成功");
        }
        else{
            //失败原因,可能路径写错了
            NSLog(@"创建失败");
        }
    }
    
    /**创建表*/
    - (void)createTable{
    #warning
        //1.建表语句 create table 字符串大小写没有影响  表名:LQUser  键名字:ID, name, age
        //建表第二个会把第一个覆盖掉  为了防止这个现象 在表名前添加 :if not exists
        //键对应的值的类型,//默认为type (无类型,可以存任何类型数据)  不同的类型直接在键后面添加相应的类型即可
        //为了防止有些name 的值是一样的  在 ID 后面直接 添加主键即可primary key  这样添加第二个部分相同属性的时候,不会被覆盖
        
        // 建表语句                      ↓如果表不存在   ↓表名   ↓键 ↓类型   ↓ 主键
    //    NSString *sql = @"create table if not exists LHYUser(ID integer primary key, name varchar(32), age integer,)";//默认为text
        
    #warning 创建表格是要把数据库打开的
        
        
          NSString *sql = @"create table if not exists LQUser(ID integer primary key, name varchar(32), age integer)";
        
        
        
        
       BOOL ret = [self.dataBase executeUpdate:sql];
        
        if (ret) {
            NSLog(@"建表成功");
        }
        else{
            
            NSLog(@"建表失败");
            
        }
        
        
    }
    
    /**增*/
    - (void)insertAction{
        //增SQL
        //给谁赋值 就再括号里面写上相应的键
        //值values () 在这里面写上相应的值  不管是什么类型的值 都用?来表示
        NSString *sql = @"insert into LQUser (ID,name,age) values (?, ?,?)";
        
        //执行语句
        //这里的ID 和 values 不能传基本数据类型  因为创建数据库的时候是integer类型
        [self.dataBase executeUpdate:sql,@88,@"xiaoqiang",@56];
        
        
        
        
        
    }
    
    /**删*/
    - (void)deleteAction{
        
        //删除语句
        //这条语句会删除数据库里面的所有数据
    //    NSString *sql = @"delete * from LQUser";
        
        //为了选定哪个数据 我们要选定一些条件 where ID = ?
        // ? 要英文字符
        // 多个条件我们用 and 做拼接
        //where name = ?  and age = ?
        NSString *sql = @"delete from LQUser where ID = ? ";
        
        //执行删除
        [self.dataBase executeUpdate:sql,@3];
    
    }
    
    /**改*/
    - (void)updateAction{
        //SQL 语句
        // 用逗号,隔开
        //改哪条 用where
        //多条件也是用and连接
        NSString *sql = @"update LQUser set name = ?, age = ? where ID = ?";
        [self.dataBase executeUpdate:sql,@"xiaoyi",@999,@1];
        
        
        
        
    }
    
    /**查*/
    - (void)selectTable{
        
    #warning 查询的结果默认是按照主键升序的  我们也可以进行其他条件进行升序  例如 我们以age字段进行排列, 用 order by age    如果我们需要以降序排列,在最后添加一个desc
        
    #warning 查询也可以进行条件查询,
        //查询表里面所有的数据
        NSString *sql = @"select *from LQUser order by age desc";
        
        //执行一个查询的操作 executeQuery
        //executeQuery  返回值是FMResultSet 类型
        
      FMResultSet *set = [self.dataBase executeQuery:sql];
        
        //FMResultSet 是一个数据的集合,里面存放的是查询到的所有数据
        //如果想拿到其中的数据,只能遍历这个集合,一条条的拿
        
        while (set.next) {
            
            //通过键的名字,来获取对应的值
            
            //写法一:
           //NSString *ID = [set objectForColumnName:@"ID"];
            //写法二  ID 的类型是NSNumber类型
            
            NSInteger ID = [[set objectForColumnName:@"ID"] integerValue];
            
            NSString *name = [set objectForColumnName:@"name"];
            
            //通过键的下标,获取对应的值
            //下标为建表的时候,声明的key的顺序,从0开始
            NSNumber *age = [set objectForColumnIndex:2];
            
            NSLog(@"查出来的结果");
            //打印
            NSLog(@"%zd,%@,%@",ID,name,age);
        }
    
        
    }
    

    相关文章

      网友评论

          本文标题:3.1 数据持久化(存储)---数据存储(FMDBDemo)

          本文链接:https://www.haomeiwen.com/subject/bqgtgqtx.html