在设备设置中,AutoLock为5分钟,密码锁定为Immediatly。
假设用户在从服务器处理大型xml并插入/更新数据库文件时,单击了设备的电源按钮。 (当用户点击电源按钮时,设备将处于定位状态)当设备被锁定时,我们会看到错误,如
failed to CREATE statement with message 'unable to open database file'.' or disk I/O error
我们正在处理xml时执行sqlite3_step,sqlite3_exec,sqlite3_prepare_v2操作。
试过这些..
- (sqlite3 *) getMainDatabase{
if(databasemain == nil){
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"mydb.sqlite"];
if (sqlite3_open_v2([dbPath UTF8String], &databasemain, SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_FILEPROTECTION_COMPLETEUNLESSOPEN, NULL) == SQLITE_OK){
}else{
MyLogAll(@"db not opened");
}
}
return databasemain;
}
还尝试使用SQLITE_OPEN_FILEPROTECTION_NONE,但没有更改..
还尝试了没有加密参数
if(sqlite3_open([dbPath UTF8String],& database)== SQLITE_OK){
}
在设备锁定状态下,也会丢失存储在NSUserDefaults中的值。
请分享您的经验,以指导我正确的方向。
寻找一种方法来处理这种即时密码锁的情况..
答案 0 :(得分:1)
如果密码和设备被锁定,写入数据库(文件)将导致磁盘I / O错误。 对于某些设备,您可以修改打开标志(SQLITE_OPEN_FILEPROTECTION_NONE)来解决问题。但是这个方法在其他一些设备中无效。然后您可以修改上层目录FileProtection属性,例如:
[[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey] ofItemAtPath:[NSHomeDirectory() stringByAppendingFormat:@"/Documents"] error:NULL];