数据存储 - libsqlite3和FMDB的基本使用和区别

一、简要介绍

libsqlite3是IOS中纯C语言操作Sqlite数据库的一个库文件。使用起来和OC面向对象的方式有点别扭,不是特别的方便。

FMDB是IOS平台的SQLite数据库框架,以OC的方式封装了SQLite的C语言的API。FMDB使用起来更加的面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加的轻量级和灵活。提供了多线程安全的数据库操作的方法,有效的防止数据混乱。开源地址

二、基本使用和对比

数据库操作对象

  • C语言方式:
sqlite3 *_db;
  • FMDB方式:
FMDatabase *db;

打开数据库

  • C语言方式:
- (void)openDB{
    //获取数据库文件路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];
    //将OC字符串转换为c语言的字符串
    const char *cfileName = fileName.UTF8String;
    //打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
    int result = sqlite3_open(cfileName, &_db);
    if (result == SQLITE_OK) {//打开成功
        NSLog(@"成功打开数据库");
    }else{
        NSLog(@"打开数据库失败");
    }
}
  • FMDB方式:
- (void)openDB {
    //1、获取数据库文件路径
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];
    
    //2、获取数据库连接
    _db = [FMDatabase databaseWithPath:fileName];

    //3、打开数据库连接
    if ([_db open]) {
        NSLog(@"打开数据库成功");
    }else{
        NSLog(@"打开数据库失败");
    }
}

创建表格

  • C语言方式:
- (void)createTable{
    //创建表
    const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";
    char *errmsg= NULL;
    int result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg);
    if (result==SQLITE_OK) {
        NSLog(@"创建表成功");
    }else{
        NSLog(@"创建表失败---%s",errmsg);
    }
}
  • FMDB方式:
- (void)createTable{
    BOOL result = [_db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
    if (result) {
        NSLog(@"创建表格成功");
    }else{
        NSLog(@"创建表格失败");
    }
}

插入数据

  • C语言方式:
- (void)insertData{
    //插入数据
    for (int i=0; i<10; i++) {
        //拼接sql语句
        NSString *name = [NSString stringWithFormat:@"yixiangboy--%d",arc4random_uniform(100)];
        int age = arc4random_uniform(20)+10;
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student (name,age) VALUES ('%@',%d);",name,age];

         //执行SQL语句
        char *errmsg = NULL;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
        if (errmsg) {//如果有错误信息
            NSLog(@"插入数据失败--%s",errmsg);
        }else{
            NSLog(@"插入数据成功");
        }
    }
}
  • FMDB方式:
- (void)insertData{
    for (int i=0; i<10; i++) {
        NSString *name = [NSString stringWithFormat:@"yixiang-%d",arc4random_uniform(100)];
        int age = arc4random_uniform(20)+10;
        BOOL result = [_db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);",name, @(age)];
        if (result) {
            NSLog(@"插入成功");
        }else{
            NSLog(@"插入失败");
        }
    }
}

删除数据

  • C语言方式:
- (void)deleteData{
    //删除age小于15的数据
    NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE age<15"];
    char *errmsg = NULL;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"删除数据失败");
    }else{
        NSLog(@"删除数据成功");
    }
}
  • FMDB方式:
- (void)deleteData{
    BOOL result = [_db executeUpdate:@"DELETE FROM t_student WHERE age<15"];
    if (result) {
        NSLog(@"删除成功");
    }else{
        NSLog(@"删除失败");
    }
}

更新数据

  • C语言方式:
- (void)updateData{
    //大于20岁的都置为20岁
    NSString *sql = [NSString stringWithFormat:@"UPDATE t_student set age=20 WHERE age>20"];
    char *errmsg = NULL;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"更新数据失败");
    }else{
        NSLog(@"更新数据成功");
    }
}
  • FMDB方式:
- (void)updateData{
    BOOL result = [_db executeUpdate:@"UPDATE t_student set age=20 WHERE age>20"];
    if (result) {
        NSLog(@"更新成功");
    }else{
        NSLog(@"更新失败");
    }
}

查询数据

  • C语言方式:
- (void)queryData{
    const char *sql = "SELECT id,name,age FROM t_student WHERE age<20";
    sqlite3_stmt *stmt = NULL;
    //进行查询前的准备工作
    if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK){//SQL语句没有问题
        NSLog(@"查询语句没有问题");
        //每调用一次sqlite3_step函数,stmt就会指向下一条记录
        while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录
            //取出数据
            //(1)取出第0个字段的值(int)
            int ID=sqlite3_column_int(stmt, 0);
            
            //(2)取出第一列字段的值(text)
            const unsigned char *name = sqlite3_column_text(stmt, 1);
            
            //(3)取出第二列字段的值(int)
            int age = sqlite3_column_int(stmt, 2);
            printf("%d %s %d\n",ID,name,age);
        }
    }else{
        NSLog(@"查询语句有问题");
    }
}
  • FMDB方式:
- (void)queryData{
    FMResultSet *resultSet = [_db executeQuery:@"SELECT * FROM t_student WHERE age > ?",@(20)];
    while ([resultSet next]) {
        int ID = [resultSet intForColumn:@"id"];
        NSString *name = [resultSet stringForColumn:@"name"];
        int age = [resultSet intForColumn:@"age"];
        NSLog(@"%d %@ %d",ID,name,age);
    }
}
发布了163 篇原创文章 · 获赞 18 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/songzhuo1991/article/details/103420610
今日推荐