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

前言:

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


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

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

mac终端sqlite3

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

使用FMDB(查询、增加、删除)_第1张图片
数据库中的Student表
使用FMDB(查询、增加、删除)_第2张图片
表中的数据

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

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

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

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


使用FMDB(查询、增加、删除)_第3张图片
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(查询、增加、删除))