【iOS】使用SQLite与FMDB

iOS中的SQLite与Android中的一模一样,只是调用方法有差异。如果单从调用来讲,Android封装的一套helper更好用一些,而iOS原生的用C语言的几个函数在操作,比较麻烦。不过引入第三方框架FMDB,使用起来就方便很多。


一、SQLite的基本使用

使用步骤:

1. 导入系统框架 (C 语言 ) . (libsqlite3)
2. 头文件 #import< sqlite3.h >.
3 . sqlite3_open (fileName.UTF8String, & _ db );  打开或者创建一个数据
*_db 自己定义一个 sqlite3 的成员变量 . 进行正删改查时要用 .
4. sqlite3_exec (_db, sql, NULL, NULL,&error);
* 该函数可进行 insert , delete , update 操作 .
5 . 查询操作 select .
* sqlite3_prepare_v2 (_db, sql, -1, &stmt, NULL); 做查询前准备 , 检测 SQL 语句是否正确 .
* sqlite3_step(stmt) 提取查询到的数据 , 一次提取一条 .
* sqlite3_column_text(stmt, 0) 取出第 0 列的数据 .

直接看代码更易懂:
创建或打开数据库:
   // 0.获取文件地址
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"];
    
	// 1.打开或者创建一个数据库
    // (1.如果数据库不存在就会自动创建数据库并打开, 2.如果数据库存储就会自动打开数据库)
    int result = sqlite3_open(fileName.UTF8String, &_db);
    if (result == SQLITE_OK) {
        NSLog(@"打开数据库成功");
        // 2.创建表
        /**
         sqlite3 传递已经打开的数据库
         sql: 需要执行的数据库语句
         */
        const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);";
        char *error = nil;
        // 在db数据库中执行sql语句
        sqlite3_exec(self.db, sql, NULL, NULL, &error);
        if (error) {
            NSLog(@"创建表失败");
        }else
        {
            NSLog(@"创建表成功");
        }
    }else
    {
         NSLog(@"打开数据库失败");
    }

插入数据:(更新,删除与此类似)
// 1.拼接插入sql语句
        NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i];
        int age = arc4random_uniform(100);
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(name, age) VALUES ('%@', %d);", name, age];
        char *error = nil;
        // 2.执行插入sql语句
        sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error);
        if (error) {
            NSLog(@"添加失败");
        }else
        {
            NSLog(@"添加成功");
        }

查询数据:
const char *sql = "SELECT name, age FROM t_student;";
//    char *error = nil;
//    sqlite3_exec(self.db, sql, NULL, NULL, &error);
    sqlite3_stmt *stmt; // 用于提取数据的
    // 1.做查询前的准备, 检查sql语句是否正确
    int result = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL);
    if (result == SQLITE_OK) {// 准备完成, 没有错误
        // 2.提取查询到的数据到stmt, 一次提取一条
        // 如果返回值为SQLITE_ROW, 就代表提取到了一条记录
       while(sqlite3_step(stmt) == SQLITE_ROW)
       {
           // 3.取出提取到的记录(数据)中的第0列的数据
           const unsigned char *name = sqlite3_column_text(stmt, 0);
           int age = sqlite3_column_int(stmt, 1);
           NSLog(@"%s %d", name, age);
       }
    }

二、FMDB的使用
FMDB的好处是对基本C库的封装,方便使用。同时还提供了多线程操作数据库带来的读脏数据等问题的方法。


使用:(需要 FMDatabase *db 成员变量
创建或打开:
// 0.获取沙盒路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"];
    
	// 1.获得数据库对象
    self.db = [FMDatabase databaseWithPath:fileName];
    
    // 2.打开数据库
    if ([self.db open]) {
        NSLog(@"打开成功");
        // 2.1创建表
       BOOL success =  [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, age INTEGER NOT NULL);"];
        if (success) {
            NSLog(@"创建表成功");
        }else
        {
            NSLog(@"创建表失败");
        }
    }else
    {
        NSLog(@"打开失败");
    }

插入操作: (更新,删除与此类似)
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student(name , age) VALUES(?, ?);", @"xuneng", @(10)];// 注意只能拼接对象类型
        if (success) {
            NSLog(@"添加成功");
        }else
        {
            NSLog(@"添加失败");
        }

查询:
// 1.查询
    FMResultSet *set = [self.db  executeQuery:@"SELECT * FROM t_student;"];
    
    // 2.取出数据
    while ([set next]) {
        
        // 取出姓名
//       NSString *name = [set stringForColumnIndex:1];
        // 取出年龄
//       int age = [set intForColumnIndex:2];
        NSString *name = [set stringForColumn:@"name"];
        int age = [set intForColumn:@"age"];
        NSLog(@"name = %@, age = %d", name, age);
    }

FMDB还能定义操作队列 FMDatabaseQueue ,这个队列是线程安全的。( FMDatabase不是线程安全的

同时还能开启 事物 、提交事物。使用相当方便。

可参照https://github.com/ccgus/fmdb上进行学习,写的相当详细。


转载请注明出处:http://blog.csdn.net/xn4545945  



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值