簡體   English   中英

如何在未啟用iCloud時存儲核心數據日志?

[英]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事務。

但是,無論哪一種,都需要考慮幾個相關的復雜情況:

  1. 如果用戶在您的應用程序運行時禁用iCloud,則無法繼續使用現有的持久存儲協調程序甚至是現有的數據存儲。 如果這樣做,您的應用程序將嘗試編寫事務日志,失敗,因為沒有地方可以放置它們,然后崩潰。 您需要轉移到新的非iCloud數據存儲。 您可以使用migratePersistentStore:toURL:options:withType:error:一步完成此操作,但您必須執行此操作。 (順便說一下,有可能只是弄亂數據存儲的元數據,但這沒有記錄,我不知道要消除哪些鍵)。

  2. 與上述相關,如果用戶重新啟用iCloud,您將需要遷移回啟用iCloud的數據存儲。

  3. 如果在您的應用啟動時未啟用iCloud,則在設置持久性存儲協調器時,您應該只使用nil作為選項。 檢查URLForUbiquityContainerIdentifier:返回的值URLForUbiquityContainerIdentifier:並相應地繼續或不使用iCloud。

  4. 根據我的經驗 - 使用iCloud的核心數據很不穩定 除其他外, 一定要檢查addPersistentStoreWithType:etc的返回值,因為它可能會因為沒有明顯的原因而失敗(即你做的一切都正確,但iCloud只是沒有表現)。

祝你好運,你需要它。 請記住,截至今天,即使Apple也不會在自己的任何應用程序中使用iCloud和Core Data。

暫無
暫無

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

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