FMDB的一些特别使用

来源:互联网 发布:安卓输入法开发源码 编辑:程序博客网 时间:2024/04/30 01:36

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];}@endself.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 0
原创粉丝点击