实用知识:FMDB使用示例(常用)

#import "ViewController.h"
#import <FMDB/FMDB.h>

@interface ViewController ()
@property (nonatomic,strong) FMDatabase *db;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //获取沙盒Document的路径
    NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
     //在路径末端加上数据库名字,后缀.db 结尾,如果无此数据库,会自动创建
    NSString *filename = [doc stringByAppendingPathComponent:@"T_SQLTest.db"];
    //创建数据库,传一个路径即可
    self.db = [FMDatabase databaseWithPath:filename];
     //判断数据库是否打开
    if ([self.db open]) {
        NSLog(@"数据库打开成功");
        //打开成功就可以创建表T_Student,id 是主键,name 与 age 是字段,NOT NULL表示不能为空,
        BOOL result = [self.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(@"创建表成功");
        }

        /*================ 插入命令 ================*/
        NSString *name = @"WW";
        int age = 123;
        //executeUpdate:不确定的参数用?来占位(后面参数必须是oc对象,;代表语句结束)
        [self.db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES(?,?);",name,@(age)];

        //executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)
        [self.db executeUpdateWithFormat:@"INSERT INTO T_Student (name,age) VALUES(%@,%i);",name,age];

        //参数是数组的使用方式
        [self.db executeUpdate:@"INSERT INTO t_student(name,age) VALUES  (?,?);"withArgumentsInArray:@[name,@(age)]];

        /*================ 删除命令 ================*/
        int idNum = 2;
        //不确定的参数用?来占位 (后面参数必须是oc对象,需要将int包装成OC对象)
        [self.db executeUpdate:@"DELETE FROM T_Student WHERE id = ?;",@(idNum)];
        //不确定的参数用%@,%d等来占位
        [self.db executeUpdateWithFormat:@"DELETE FROM T_Student WHERE name = %@;",name];

        /*================ 修改命令 ================*/
        [self.db executeUpdate:@"UPDATE T_Student SET name = 'BB' WHERE name = '123';"];

        /*================ 查询命令 ================*/
        //根据条件查询
        FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM T_Student WHERE age>14;"];
        //查询这个表用*号
        resultSet = [self.db executeQuery:@"SELECT * FROM T_Student"];
        NSString *RSName;
        int RSAge;
        int RSid;
        //遍历resultSet对象,输出查询结果
        while ([resultSet next]) {
            //用resultSet对象来调用方法,方法返回值为查询结果
            RSid = [resultSet intForColumn:@"id"];
            RSName = [resultSet stringForColumn:@"name"];
            RSAge = [resultSet intForColumn:@"age"];
            NSLog(@"id:%d,name:%@,age:%d",RSid,RSName,RSAge);
        }

        /*================ 销毁命令 ================*/
        [self.db executeUpdate:@"DROP TABLE IF EXISTS T_Student;"];

        /*================ FMDB 多线程使用 ================*/
        /**
         *  FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
         */
        //1.创建队列,路径传要操作的数据库的文件路径
        FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filename];
        //定义一个 bool 值对象,每次执行操作都会返回,通过返回值判断是否操作成功,不成功就return
        __block BOOL whoopsSomethingWrongHappened = true;

        //2.把任务包装到事务里
        [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
             whoopsSomethingWrongHappened &=  [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('cc',33);"];
             whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('dd',44);"];

             whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('gg',55);"];
             //如果有错误 返回
             if (!whoopsSomethingWrongHappened) {
                 *rollback = YES;
                 return;
             }
         }];
    }
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值