密码立即锁定时无法打开数据库文件

时间:2014-05-20 06:30:51

标签: ios sqlite ios7 nsuserdefaults

在设备设置中,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操作。

试过这些..

  1. 在应用程序启动时打开数据库文件,在应用程序终止时关闭。因此,当用户锁定设备时,我们可以保持数据库处于打开状态..
  2. 下面是打开数据库文件的源代码,这是应用程序委托类中返回数据库文件的代码。我们从不同的类中调用此方法。 databasemain是在AplicationDelegate.h文件中声明的sqlite3 *的实例。

    - (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;
    }
    
    1. 还尝试使用SQLITE_OPEN_FILEPROTECTION_NONE,但没有更改..

    2. 还尝试了没有加密参数

      if(sqlite3_open([dbPath UTF8String],& database)== SQLITE_OK){

      }


    3. 在设备锁定状态下,也会丢失存储在NSUserDefaults中的值。

      请分享您的经验,以指导我正确的方向。

      寻找一种方法来处理这种即时密码锁的情况..

1 个答案:

答案 0 :(得分:1)

如果密码和设备被锁定,写入数据库(文件)将导致磁盘I / O错误。 对于某些设备,您可以修改打开标志(SQLITE_OPEN_FILEPROTECTION_NONE)来解决问题。但是这个方法在其他一些设备中无效。然后您可以修改上层目录FileProtection属性,例如:

[[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObject:NSFileProtectionNone forKey:NSFileProtectionKey] ofItemAtPath:[NSHomeDirectory() stringByAppendingFormat:@"/Documents"] error:NULL];