• FMDatabase 的使用(转)


    FMDatabase 对SQLite 的API进行了很好的封装,使用起来很方便。

    使用说明:https://github.com/ccgus/fmdb

    (1)引入相关文件。

    FMDatabase.h

    FMDatabase.m

    FMDatabaseAdditions.h

    FMDatabaseAdditions.m

    FMDatabasePool.h

    FMDatabasePool.m

    FMDatabaseQueue.h

    FMDatabaseQueue.m

    FMResultSet.h

    FMResultSet.m

    (2)应用

    建立数据库

    建立数据库只需要如下一行即可,当该文件不存在时,fmdb会自己创建一个。如果你传入的参数是空串:@”” ,则fmdb会在临时文件目录下创建这个数据库,如果你传入的参数是 NULL,则它会建立一个在内存中的数据库。

    FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];

    打开数据库

    使用如下语句,如果打开失败,可能是权限不足或者资源不足。通常打开完操作操作后,需要调用close方法来关闭数据库。

    if (![db open]) {

        // error

        return;

    }

    // some operation

    // ...

    [db close];

    执行更新操作

    除了Select操作之外,其它的都是更新操作。更新操作使用如下方法,如果有错误,可以用error参数中获得。

     -[FMDatabase executeUpdate:error:withArgumentsInArray:orVAList:]

    执行查询操作

    查询操作示例如下。注意:即使操作结果只有一行,也需要先调用FMResultSet的next方法。

    FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];

    while ([s next]) {

        //retrieve values for each record

    }

    FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];

    if ([s next]) {

        int totalCount = [s intForColumnIndex:0];

    }

    FMDB提供如下多个方法来获取不同类型的数据:

    intForColumn:

    longForColumn:

    longLongIntForColumn:

    boolForColumn:

    doubleForColumn:

    stringForColumn:

    dateForColumn:

    dataForColumn:

    dataNoCopyForColumn:

    UTF8StringForColumnIndex:

    objectForColumn:

    通常情况下,你并不需要关闭FMResultSet,因为相关的数据库关闭时,FMResultSet也会被自动关闭。

    数据参数

    通常情况下,你可以按照标准的SQL语句,用?表示执行语句的参数,如:

     INSERT INTO myTable VALUES (?, ?, ?)

    然后,可以我们可以调用executeUpdate方法来将?所指代的具体参数传入,通常是用变长参数来传递进去的,如下:

    NSString *sql = @"insert into User (name, password) values (?, ?)";

    [db executeUpdate:sql, user.name, user.password];

    这里需要注意的是,参数必须是NSObject的子类,所以象int,double,bool这种基本类型,需要封装成对应的包装类才行,如下所示:

    // 错误,42不能作为参数

    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];

    // 正确,将42封装成 NSNumber 类

    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];

    线程安全

    如果我们的app需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。

    使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。

    // 创建,最好放在一个单例的类中

    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

    // 使用

        [queue inDatabase:^(FMDatabase *db) {

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

        FMResultSet *rs = [db executeQuery:@"select * from foo"];

        while ([rs next]) {

            // …

        }

    }];

    // 如果要支持事务

    [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

        if (whoopsSomethingWrongHappened) {

            *rollback = YES;

            return;

        }

        // etc…

        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];

    }];

  • 相关阅读:
    TypeScript "this" 隐式具有类型 "any",因为它没有类型注释 'this' implicitly has type 'any' because it does not have a type annotation
    金仓kingbase连接报错The authentication type 10 is not supported. Check that you have configured the sys_hba.conf file to include the client's IP address or subnet
    Spring Security多次登录失败账户锁定详解
    Vue实现页面长时间不操作自动退出
    【Kingbase】数据类型格式化函数
    SpringSecurity使用注解实现匿名访问
    mysql数据库迁移到kingbase数据库上(其他数据库与其类似)
    宝塔面板安装gitlab提示配置错误解决办法
    Java正则校验密码至少包含:字母数字特殊符号中的2种
    RSA Web前端登录账户密码加密传输
  • 原文地址:https://www.cnblogs.com/417460188dy/p/3370148.html
Copyright © 2020-2023  润新知