2015-06-05 53 views
7

我正在與coredata第一次,我必須限制從文件目錄中的iCloud備份sqlite數據庫文件,我已經使用下面的代碼限制從icloud備份sqlite-wal和sqlite-shm

-(id)init 
{ 
    if((self = [super init])) 
    { 
     NSURL* documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
     NSURL* modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; 
     NSURL* giveForwardSqliteURL = [documentsDirectoryURL URLByAppendingPathComponent:@"InfoCollection.sqlite"]; 
     NSError* error; 

     m_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
     m_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:m_managedObjectModel]; 

     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 


     if ([m_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:giveForwardSqliteURL options:options error:&error]) 
     { 
      m_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
      [m_managedObjectContext setPersistentStoreCoordinator:m_persistentStoreCoordinator]; 

      [self addSkipBackupAttributeToItemAtPath:giveForwardSqliteURL]; 
     } 
     else 
     { 
      NSLog(@"Failed to create or open database: %@", [error userInfo]); 
      return nil; 
     } 
    } 

    return self; 
} 

//防止iCloud中取文件目錄文件夾的備份

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSURL *) URL 
{ 
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

    NSError *error = nil; 
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] 
           forKey: NSURLIsExcludedFromBackupKey error: &error]; 
    if(!success){ 
     NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); 
    } 
    return success; 
} 

現在我不明白的是,我們做的還需要限制的sqlite-沃爾瑪和SQLite,SHM文件從iCloud雲備份,如果是,那麼如何限制sqlite-wal和sqlite-s從iCloud雲備份HM文件

,我想在不改變從文件目錄文件夾sqlite的DB位置的解決方案......我們怎麼能做到這一點

請更正如果有什麼是錯在上面的代碼

在此先感謝

+0

你解決這個問題? – lukya

+1

如果我們需要跳過它們,爲'wal'和'shm'文件創建URL並將它們傳遞給add skip屬性方法應該非常簡單。問題是我們需要做到這一點,如果是的話,因爲這些文件可能不會在創建持久性存儲庫時創建。此外,WAL日誌定期合併到主數據庫並重新創建等。我們如何跟蹤這些更改? – lukya

+1

@lukya我沒有得到任何線索怎麼辦,如果我離開它會發生什麼..所以我添加了這些行'if([[NSFileManager defaultManager] fileExistsAtPath:[sqliteShmURL path]]){self addSkipBackupAttributeToItemAtPath:sqliteShmURL]; } if([[NSFileManager defaultManager] fileExistsAtPath:[sqliteWalURL path]]){self addSkipBackupAttributeToItemAtPath:sqliteWalURL]; }' – kumar

回答

1

,我想在不改變從 文件目錄文件夾sqlite的DB位置的解決方案......我們怎麼能做到這一點

首先,請確保您已閱讀this以確定放置文件的正確目錄。

其次,不要把它們直接放到文檔目錄中。通常,將每個文件直接填入Documents目錄並不是一個好主意。相反,您應該使用目錄層次來邏輯分區數據。

接下來,請注意,如果您從備份中排除目錄,則目錄中的所有文件也將被排除。因此,如果您願意變得有些靈活並遵循上述建議,則可以簡單地將文檔目錄的子目錄用於核心數據數據庫。

NSURL* giveForwardDirURL = [documentsDirectoryURL URLByAppendingPathComponent:@"InfoCollection.dir"]; 
[[NSFileManager defaultManager] createDirectoryAtURL:giveForwardDirURL 
         withIntermediateDirectories:YES 
              attributes:nil 
               error:NULL]; 
[self addSkipBackupAttributeToItemAtPath:giveForwardDirURL]; 

NSURL* giveForwardSqliteURL = [giveForwardDirURL URLByAppendingPathComponent:@"InfoCollection.sqlite"]; 

但是,如果你堅持讓你的文件所在的目錄,則必須在初始化時搜索它們,然後你將有監視目錄應用程序運行,因此你可以設置在相關文件出現時標記/標記。

此主題包含以下相關信息:Notification of changes to the iPhone's /Documents directory

+0

把sqlite和相關文件放在一個子目錄中是最後一種方法(大約一個月前)。所以你的解決方案是對的。但是,我正在尋找-wal和-shm文件創建和跟蹤的一些官方文檔。如果沒有別的東西出現,我可能會獎賞你的賞金。 – lukya

+0

用於跟蹤文檔目錄更改的kqueue實現(如共享的鏈接中所述)似乎是排除-wal和-shm文件的矯枉過正。子目錄方法肯定好多了。但是,因爲我沒有找到跟蹤這些文件的適當方式,所以我覺得我逃避了一個問題,因爲我找不到正確的解決方案。 – lukya

+0

如果這是你一起去的解決方案,那麼你沒有逃避一個問題,你解決了它。將Core Data數據庫放在它自己的子目錄中是正確的解決方案,除非有非常好的理由否則它應該始終完成(它也使得整個數據庫和所有臨時文件變得非常容易)。如果你想要的只是臨時文件的文檔,那麼它在這裏:https://www.sqlite.org/tempfiles.html。但是,請注意,即使SQLite作者聲明信息是信息性的,並且不保證將來繼續以這種方式工作。 –

-1

您可以強制核心數據使用回滾日記記錄模式,防止-shl和-wal文件,通過增加一個選項字典的-[NSPersistentStoreCoordinator addPersistentStore…]呼叫,像這樣的回答:

https://stackoverflow.com/a/24261845/453082

+0

這不是OP所要求的... – lukya

+0

我現在,但它是一種解決方法,首先防止-shl和-wal文件被創建。最終結果是相同的 - 不會備份這些文件。 – Aderstedt

+0

我不同意。預期的最終結果是應該創建-wal和-shm文件,但不備份到iCloud。不允許創建文件與僅備份它們不同。有一些WAL日誌模式具有優勢的好例子。 – lukya