美文网首页
使用FMDB(查询、增加、删除)

使用FMDB(查询、增加、删除)

作者: 简洁的美 | 来源:发表于2017-01-01 21:28 被阅读0次

    前言:

    上回我们解决了遇到的第一个问题,心里有点小窃喜。但是,别高兴的太早,未来还有更多的问题等待着我们呢。一起努力吧!


    此时,我们开始使用FMDB来管理数据库。

    首先,为大家推荐一款可视化sqlite数据库管理工具:SQLite Manager,我认为挺好用的,毕竟我们只是测试用,只要能够看见数据的增删就OK了。
    注:mac终端有一个专门的sqlite3数据库,进入终端->sqlite3 test.db,直接进入,但是对我而言,不太好用,不直观,个人观点。

    mac终端sqlite3

    1.用上面的工具先创建一个简单的数据库

    数据库中的Student表 表中的数据

    2.将数据库和我们的应用连接起来,将数据库导入工程里面

    在工程里面获取该数据库的时候,我们会使用如下代码:

    //获取工程里面的数据库路径
    NSString *studentDBPath = [[NSBundle mainBundle] pathForResource:@"studentSqlite" ofType:@"db"];
    

    但是,有时你会发现根本找不到下面的文件,获取的 studentDBPath 为空。明明工程里面有数据库文件,代码却找不到,很是奇怪???
    解决的办法是:


    NSBundle能够找到的文件

    照上图,在Build Phases里面,使用上面的方法找到的所有文件只能是在Copy Bundle Resources里面包含的文件,否则,查找不到。

    CopyBundle Resources 主要是一些资源文件会被打包的时候会被放入app中

    3. 替换数据库

    3.1 创建空数据库

    刚刚导入的数据库只是在工程里面,我们编译运行后,手机软件里面的文件并没有导入的数据库,所以需要先创建一个空的数据库到软件Document

    //获取文档路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    //创建一个空文件(数据库)
    NSString *fileName = [path stringByAppendingPathComponent:@"test.db"]
    

    上面创建了一个空的数据库,如果接下来我们就直接打开数据

    //创建数据库实例
    FMDatabase *database = [[FMDatabase alloc]initWithPath:fileName];
    
    if ([database open]) {
          NSLog(@"打开数据库成功");
    }
    

    你会看到下面的错误消息,提示你没有找到某某表, table不存在

    2016-12-30 21:58:47.460 1_数据库fmdb简单测试[839:53506] 打开数据库成功
    2016-12-30 21:58:47.462 1_数据库fmdb简单测试[839:53506] DB Error: 1 "no such table: student"
    2016-12-30 21:58:47.462 1_数据库fmdb简单测试[839:53506] DB Query: select * from student;
    

    想着也是,我们创建的是空数据库,还没有创建表,所以会报这个错误

    3.2 替换空数据库

    上面我们已经在软件内部(NSDocumentDirectory)创建了一个新的空数据库,然后把我们工程里面的数据库替换掉这个空数据库

    //1.先在Document里面查找看有没有对应的数据库,有的话就不用替换了
    NSArray *searchPaths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [searchPaths objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"studentDB.db"];
    NSLog(@"%@",dbPath);
    
    //2.使用NSFileManager才能直接管理应用里面的文件,进行替换或者删除
    NSFileManager *fileManager = [[NSFileManager alloc]init];
    BOOL isExit = [fileManager fileExistsAtPath:dbPath];
    
    //如果不存在,将工程里面数据库的复制到Document里面
    if (!isExit) {
            NSLog(@"原来不存在数据库");s
            //获取工程里面的数据库路径,如果获取不到路径,往上翻翻,有解决办法
            NSString *studentDBPath = [[NSBundle mainBundle] pathForResource:@"studentSqlite" ofType:@"db"];
            NSLog(@"%@",studentDBPath);
    
            //替换数据库
            BOOL success = [fileManager copyItemAtPath:studentDBPath toPath:dbPath error:nil];
            if (success) {
                 NSLog(@"数据库替换成功");
          }
    

    到目前为止,存在应用里面的就是我们自己创建的有数据的数据库了。

    4.FMDB数据库查询、增加、删除

    4.0 打开数据库

    //1.获得数据库文件的路径

    FMDatabase *database = [[FMDatabase alloc]initWithPath:dbPath];
    if ([database open]) {
           NSLog(@"打开数据库成功");
    }
    
    4.1 查询
    //使用SQL语句,从表中获取一个集合
    FMResultSet *resultSet = [database executeQuery:@"select * from student;"];
    //[resultSet next],会一条一条的遍历,直到为空值结束循环
    while ([resultSet next]) {
    
          Student *stu = [[Student alloc]init];
          stu.number = [resultSet intForColumn:@"number"];
          stu.name = [resultSet objectForColumnName:@"name"];
          stu.age = [resultSet intForColumn:@"age"];
    sssss
          /**一开始,数组students没有数据,而且也添加不进去数据,是因为:没有初始化,即没有内存空间放数据*/
          [self.students addObject:stu];
    }
    
    4.2 增加

    对于增加,我是直接设置一个按钮,点击一下就往数据库里面填写一条数据,使用SQLite Manager,可以方便看到增加进了数据库,主动调用SQLiteManager,非常方便

    数据库除了查询,其他都是更新

    #pragma mark - 添加数据
    - (IBAction)updateData:(id)sender {
        NSString *name = @"新添加的";sw
        NSInteger age = arc4random();
        BOOL success = [database executeUpdate:@"insert into student (name,age)      values(?,?)",name,@(age)];
        if (!success) {
                NSLog(@"%@",[database lastErrorMessage]);
         }
    }
    
    4.3 删除数据
    #pragma mark - 删除数据
    - (IBAction)deleteData:(id)sender {
         //delete from student where number = 1 ,这是SQL语句,有空的朋友可以去了解SQL语句
         NSString *deleteData = [NSString stringWithFormat:@"delete from student where number = 1 "];
         //开始一直没有删除成功, 原因是 把数据库的 名字写成了表的名字了
         BOOL success = [self.db executeUpdate:deleteData];
         if (success) {
             NSLog(@"删除成功");
         }
    }
    

    5. 总结

    到此为止,一般简单的FMDB操作都已经写完了,还有多线程操作,目前还没有学习到,到学习了以后再次添加,还要抽个时间大概了解一下SQL语言。

    由于这是第一次在简书上写文章,有什么不妥的地方,欢迎评论,一起探讨交流。
    2017年到了,祝大家元旦快乐。。。

    github示例库:https://github.com/Brucelin2015/FMDBSimpleOperation

    相关文章

      网友评论

          本文标题:使用FMDB(查询、增加、删除)

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