一, 简要介绍
libsqlite3 是 iOS 中纯 C 语言操作 SQLite 数据库的一个库文件. 使用起来和 OC 面向对象的方式有点别扭, 不是特别的方便.
FMDB 是 iOS 平台的 SQLite 数据库框架, 以 OC 的方式封装了 SQLite 的 C 语言的 API.FMDB 使用起来更加的面向对象, 省去了很多麻烦, 冗余的 C 语言代码, 对比苹果自带的 Core Data 框架, 更加的轻量级和灵活. 提供了多线程安全的数据库操作的方法, 有效的防止数据混乱. 开源地址为 https://github.com/ccgus/fmdb .
如果觉得对你还有些用, 就关注小编 + 喜欢这一篇文章. 你的支持是我继续的动力.
下篇文章预告: NSNotificationCenter 使用小结
文章来源于网络, 如有侵权, 请联系小编删除.
下面我们就对比他们两者的使用, 好坏优劣立马就可以分晓.
二, 基本使用和对比
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(@"插入失败");
- }
- }
- }
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(@"删除数据成功");
- }
- }
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);
- }
- }
3, 最后说一点
来源: http://www.jianshu.com/p/f0fadfd3df6f