[英]How do I store core data logs when iCloud isn't enabled?
我希望用戶能夠在禁用iCloud時繼續正常使用核心數據存儲。 我遇到的唯一問題是,它們可能有很多數據在啟用時生成日志,然后如果它們再次啟用它,我會堅持要么不添加自那時以來所做的所有數據,要么添加所有數據,從而復制現有數據。 為了避免這個問題,我希望在禁用iCloud時繼續制作日志,這樣它就可以在再次啟用時上傳這些更改。
這是連接到iCloud時我必須執行的代碼:
NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];
NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
[options setObject:iCloudEnabledAppID forKey:NSPersistentStoreUbiquitousContentNameKey];
[options setObject:iCloudLogsPath forKey:NSPersistentStoreUbiquitousContentURLKey];
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:store
options:options
error:nil];
不幸的是,這不是一個選擇。 啟用iCloud 並使用NSPersistentStoreUbiquitousContentNameKey
,將自動創建Core Data事務日志。 在所有其他情況下,不會創建任何事務日志。 如果沒有啟用iCloud,您的代碼就無法強制創建日志。 當嘗試將iCloud與Core Data一起使用時,這種情況只是許多意想不到的復雜情況之一。
一種可能的方法:當您發現已啟用iCloud時,將整個數據存儲遷移到iCloud,並且不必擔心是否已存在任何內容。 然后,使用重復檢測方法清除重復的條目。 Apple在他們的SharedCoreData
示例項目中提供了一個很好的重復檢測代碼示例,在WWDC 2012會話227, 使用iCloud和Core Data進行了介紹 。
另一種方法是在禁用iCloud時維護自己的更改日志。 使用NSManagedObjectContextDidSaveNotification
監視更改,並保留您自己的iCloud禁用時更改的對象列表。 如果重新啟用iCloud,則可以重新保存這些對象以為它們生成iCloud事務。
但是,無論哪一種,都需要考慮幾個相關的復雜情況:
如果用戶在您的應用程序運行時禁用iCloud,則無法繼續使用現有的持久存儲協調程序甚至是現有的數據存儲。 如果這樣做,您的應用程序將嘗試編寫事務日志,失敗,因為沒有地方可以放置它們,然后崩潰。 您需要轉移到新的非iCloud數據存儲。 您可以使用migratePersistentStore:toURL:options:withType:error:
一步完成此操作,但您必須執行此操作。 (順便說一下,有可能只是弄亂數據存儲的元數據,但這沒有記錄,我不知道要消除哪些鍵)。
與上述相關,如果用戶重新啟用iCloud,您將需要遷移回啟用iCloud的數據存儲。
如果在您的應用啟動時未啟用iCloud,則在設置持久性存儲協調器時,您應該只使用nil
作為選項。 檢查URLForUbiquityContainerIdentifier:
返回的值URLForUbiquityContainerIdentifier:
並相應地繼續或不使用iCloud。
根據我的經驗 - 使用iCloud的核心數據很不穩定 。 除其他外, 一定要檢查addPersistentStoreWithType:etc
的返回值,因為它可能會因為沒有明顯的原因而失敗(即你做的一切都正確,但iCloud只是沒有表現)。
祝你好運,你需要它。 請記住,截至今天,即使Apple也不會在自己的任何應用程序中使用iCloud和Core Data。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.