簡體   English   中英

密碼立即鎖定時無法打開數據庫文件

[英]unable to open database file when passcode locks immediately

在設備設置中,“自動鎖定”為5分鍾,“密碼鎖定”為“立即”。

假設用戶在應用程序正在處理來自服務器的較大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. 在應用程序啟動時打開數據庫文件,在應用程序終止時關閉數據庫文件。 因此,當用戶鎖定設備時,我們可以使數據庫保持打開狀態。

下面是打開數據庫文件的源代碼,這是應用程序委托類中返回數據庫文件的代碼。 我們從不同的類調用此方法。 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. 也嘗試了沒有加密參數

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

    }


在設備鎖定狀態下,也會丟失存儲在NSUserDefaults中的值。

請分享您的經驗,以指導我正確的方向。

尋找一種方法來處理這種立即密碼鎖定的情況。

如果具有密碼並且設備已鎖定,則寫入數據庫(文件)將獲得磁盤I / O錯誤。 對於某些設備,您可以修改打開標記(SQLITE_OPEN_FILEPROTECTION_NONE)以解決問題,但是此方法在其他設備上無效,然后可以修改上層目錄FileProtection屬性,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM