雷石服务器不显示加密,FMDB数据库加密问题---数据不显示

问题: 从未加密得数据库升级到加密数据库,则需要考虑到兼容问题

方案: 打开数据库open -> 设置秘钥 setkey -> 查看连接 goodConnection -> 新建数据库并迁移数据

代码

- (BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName {

#if SQLITE_VERSION_NUMBER >= 3005000

if (_db) {

return YES;

}

int err = sqlite3_open_v2([self sqlitePath], (sqlite3**)&_db, flags, [vfsName UTF8String]);

if(err != SQLITE_OK) {

NSLog(@"error opening!: %d", err);

return NO;

} else {

[self setKey:DB_KEY];

}

if (![self goodConnection]) {

if ([NSString stringWithCString:[self sqlitePath] encoding:NSUTF8StringEncoding]) {

[self upgradeDatabase:[NSString stringWithCString:[self sqlitePath] encoding:NSUTF8StringEncoding]];

// 下面几行是重点,很多不细心得程序员总是喜欢拷贝别人的文章粘贴成自己的博客,真是害人。

// 原因:原本是未加密得数据库,设置setKey没效果,需要迁移数据库之后再设置一次才有效

// u can try: 把下面5行隐藏了实验。从你从未加密数据库升级过来,第一次打开App总是没有数据,只有第二次打开App才会有数据显示。

[self close];

BOOL reRes = [self openWithFlags:flags vfs:vfsName];

if (reRes) {

[self setKey:DB_KEY];

}

}

}

if (_maxBusyRetryTimeInterval > 0.0) {

// set the handler

[self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];

}

return YES;

#else

NSLog(@"openWithFlags requires SQLite 3.5");

return NO;

#endif

}

- (void)upgradeDatabase:(NSString *)path{

NSString *targetPath = [NSString stringWithFormat:@"%@.tmp.db", path];

if(targetPath){

const char* sqlQ = [[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS encrypted KEY '%@';", targetPath, DB_KEY] UTF8String];

sqlite3 *unencrypted_DB;

if (sqlite3_open([path UTF8String], &unencrypted_DB) == SQLITE_OK) {

char *errmsg;

// Attach empty encrypted database to unencrypted database

sqlite3_exec(unencrypted_DB, sqlQ, NULL, NULL, &errmsg);

if (errmsg) {

NSLog(@"%@", [NSString stringWithUTF8String:errmsg]);

sqlite3_close(unencrypted_DB);

}

// export database

sqlite3_exec(unencrypted_DB, "SELECT sqlcipher_export('encrypted');", NULL, NULL, &errmsg);

if (errmsg) {

NSLog(@"%@", [NSString stringWithUTF8String:errmsg]);

sqlite3_close(unencrypted_DB);

}

// Detach encrypted database

sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, &errmsg);

if (errmsg) {

NSLog(@"%@", [NSString stringWithUTF8String:errmsg]);

sqlite3_close(unencrypted_DB);

}

sqlite3_close(unencrypted_DB);

//delete tmp database

[self removeDatabasePath:targetPath targetPath:path];

}

else {

sqlite3_close(unencrypted_DB);

NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));

}

}

}

- (void)removeDatabasePath:(NSString *)targetPath targetPath:(NSString *)sourcePath {

NSFileManager *fm = [[NSFileManager alloc] init];

[fm removeItemAtPath:sourcePath error:nil];

[fm moveItemAtPath:targetPath toPath:sourcePath error:nil];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FMDB的封装,使你的实体类具备数据库操作的功能,极大简化你的数据库操作,对于自己的扩展也非常简单。 该框架是本人在项目中用到的对FMDB的封装,它的特点如下: 1.自动创建数据库、自动创建数据库表。 2.自动检测字段添加新字段。 3.一行代码实现数据库的CURD操作。 4.源码及其简单,易于理解和掌握。 5.扩展自己的功能也非常得简单,容易。 6,只关心字段和字段值,完全不用关心数据库操作逻辑. 特别提示:字段值全部以字符串的形式统一处理 常用的api如下: /** 获取数据库单例函数 */ (instancetype)intance; /** 数据库中是否存在表 */ - (BOOL)isExistWithTableName:(NSString*)name; /** 默认建立主键id 创建表(如果存在则不创建) , keys 数据存放要求@[字段名称1,字段名称2] */ -(BOOL)createTableWithTableName:(NSString*)name keys:(NSArray*)keys; /** 插入 只关心key和value @{key:value,key:value} */ -(BOOL)insertIntoTableName:(NSString*)name Dict:(NSDictionary*)dict; /** 根据条件查询字段 返回的数组是字典( @[@{key:value},@{key:value}] ) ,where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(NSArray*)queryWithTableName:(NSString*)name keys:(NSArray*)keys where:(NSArray*)where; /** 全部查询 返回的数组是字典( @[@{key:value},@{key:value}] ) */ -(NSArray*)queryWithTableName:(NSString*)name; /** 根据key更新value 形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(BOOL)updateWithTableName:(NSString*)name valueDict:(NSDictionary*)valueDict where:(NSArray*)where; /** 根据表名和表字段删除表内容 where形式 @[@"key",@"=",@"value",@"key",@">=",@"value"] */ -(BOOL)deleteWithTableName:(NSString*)name where:(NSArray*)where; /** 根据表名删除表格全部内容 */ -(BOOL)clearTable:(NSString*)name; /** 删除表 */ -(BOOL)dropTable:(NSString*)name;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值