iOS开发数据存储—libsqlite3和FMDB的基本使用和区别

一、简要介绍

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

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

下面我们就对比他们两者的使用,好坏优劣立马就可以分晓。

二、基本使用和对比

2.0、数据库操作对象

C语言方式:

sqlite3 *_db;

FMDB方式:

FMDatabase *db;

2.1、打开数据库

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(@"打开数据库失败");

    }


}

2.2、创建表格

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(@"创建表格失败");

    }

}


2.3、插入数据

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(@"插入失败");

        }

    }

}

12

2.4、删除数据

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(@"删除数据成功");

    }

}

1

FMDB方式:

- (void)deleteData{

    BOOL result = [_db executeUpdate:@"DELETE FROM t_student WHERE age<15"];

    if (result) {

        NSLog(@"删除成功");

    }else{

        NSLog(@"删除失败");

    }

}

2.5、更新数据

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(@"更新失败");

    }

}


2.6、查询数据

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);

    }

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值