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的值会为空。