FMDB的一些特别使用

2 篇文章 0 订阅

1.使用FMDB类获取数据记录集合Count的方法

很多时候,我们在查询一个表的时候,不想得到里面的记录内容,只是想简单的得到符合查询条件的记录条数。FMDB中有一个很简单的方法就可以实现,见下面的代码实例。

#import "FMDB.h"
#import "FMDatabaseAdditions.h"
//一定要记着引入上面这个头文件哦

//初始化FMDatabase对象的部分省略……
    [db open];
    NSUInteger count = [db intForQuery:@"select count(*) from LoginUser"];
    [db close];

恩,就这样,一句搞定。

2.数据库文件加密

pod file文件里设置

pod 'FMDB/SQLCipher','~> 2.6.2'

FMDB使用的版本是2.6.2(目前最新版),SQLCipher是3.1.0版本(支持ios7的,以上的版本就是需要支持ios8的了)

FMEncryptDatabaseQueue通过继承FMDatabaseQueue类,拿到FMDatabase *_db对象,去调用setKey方法即可,见代码如下:

#import <FMDB/FMDB.h>

@interface FMEncryptDatabaseQueue :FMDatabaseQueue

/**
 *  设置数据库加密key
 *
 *  @param key 加密key
 *
 *  @return 加密是否成功
 */
- (BOOL)setKey:(NSString*)key;

@end
#import "FMEncryptDatabaseQueue.h"

@implementation FMEncryptDatabaseQueue

- (BOOL)setKey:(NSString*)key
{
    return [_dbsetKey:key];
}

@end

self.queue = [[FMEncryptDatabaseQueuealloc] initWithPath:DataBaseName];
[self.queuesetKey:@"DBPasswordKey"];//设置数据库加密key

另外,打开加密数据库文件要用至少4.3.5版本的SQLiteManager,低版本的不知为何打不开。

还有另一种方式加密,就是直接使用SQLCipher

pod 'SQLCipher','~> 3.1.0’

SQLCipher的3.4.0, 3.3.1两个版本是需要支持ios8的,前面也说了。

SQLCipher里包含sqlite3.h和sqlite3.c这两个源文件(这个第三方库里就只有这两个文件),加密方式主要就是sqlite3.c文件里的sqlite3_key函数的调用。

代码如下:

NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)objectAtIndex:0]
                              stringByAppendingPathComponent:@"cipher.db"];
    NSLog(@"数据库地址:%@",databasePath);
    sqlite3 *db;
    if (sqlite3_open([databasePathUTF8String], &db) == SQLITE_OK) {
        const char* key = [@"abc123"UTF8String];
        sqlite3_key(db, key, (int)strlen(key));//数据库加密
        int result = sqlite3_exec(db, (constchar*) "SELECT count(*) FROM sqlite_master;",NULL, NULL,NULL);
        if (result == SQLITE_OK) {
            NSLog(@"password is correct, or, database has been initialized");
            [self initTablePerson:db];
            [self insert:db];
            [self query:db];
        } else {
            NSLog(@"incorrect password! errCode:%d",result);
        }

        sqlite3_close(db);
    }

3.如果一个数据库事务里有两个查询操作,会导致后一个查询结果集出错,原因未知

代码如下:

__block NSMutableArray *array = nil;

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

        NSString *searchSQL = @"select count(*) from table";
        int count = [db intForQuery:searchSQL];

        FMResultSet *resultSet = [db executeQuery:sql];

        array = [[NSMutableArray alloc] init];

        if (count >0)
        {
            do
            {
                Model *model = [[Model alloc] init];

                NSArray *allProperties = [[Reflection sharedReflection] classPropertiesArray:[Model class]];

                for (NSString *keyin allProperties)
                {
                    NSString *columnValue = [resultSet stringForColumn:key];
                    [pluginListItem setValue:columnValue forKey:key];
                }

                [array addObject:model];
            } while ([resultSet next]);
        }

        [resultSet close];
    }];

上述代码for循环里的columnValue的值会为空。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值