2016-12-01 390 views
0

我在保存userDefaults中的一個NSManagedObject時遇到了困難,我想知道a)我應該試着做這個還是這不是一個合適的方法或者b)如果它是一個合適的方法,我怎麼能得到它上班?是否可以在NSUserDefaults中保存NSManagedObject?

我在Swift 2.3中編寫我的應用程序,它有一些用戶默認選項,其中一個用於默認的「升降機」(如舉重,例如'臥推','乾淨挺舉'傾斜臥推「)。實際上,我將它們從枚舉轉換爲核心數據實體,因爲用戶能夠跟蹤的每個電梯事件都是可用電梯類型之一(爲此我將建立適當的關係)。

這裏的擴展與性能:

extension Lift { 

    @NSManaged var liftName: String 
    @NSManaged var type: NSSet 

    } 

,並與東西Xcode是抱怨電梯實體:

class Lift: NSManagedObject, NSCoding { 
    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(liftName, forKey: "liftName") 
    } // Super.init isn't called on all paths before returning from initializer 

required init(coder aDecoder: NSCoder) { 

    // Initialization of immutable variable was never used, etc... 
    let liftName = aDecoder.decodeObjectForKey("liftName") as! String 

    } 
    } 

我之前,所以我真正處理這些類型的錯誤令人擔憂的是我是否會走上錯誤的道路。

我讀過無數線程今晚教會了我需要編碼一個對象(但不是特定的NSManagedObject)來保存它,然後在檢索它時取消編碼,並且我的類必須符合NSCoding和什麼該協議要求。但後來我見過threads,說NSManagedObjects應該被存儲在userDefaults,但我不知道這是真的。

我已經花了幾個小時,所以在我走得更遠之前,可以/應該這樣做嗎?

回答

3

不,您不應該在NSUserDefaults中存儲NSManagedObject。核心數據是一種對象持久性技術,因此以其他格式嘗試並堅持一個NSManagedObject是沒有意義的。

有幾個選擇,您可以使用:

  1. 你可以升降的名稱簡單地存儲在用戶的默認值,然後查詢這個獲取對象從核心數據回。這可能不適合你的工作,如果電梯名稱不是唯一的
  2. 可以包括標識符的屬性添加到您的提升實體店和類似的東西在屬性的UUID字符串;然後,您可以在UserDefaults中存儲相同的字符串。這將確保唯一選擇一個對象。
  3. 您可以將新的布爾屬性添加到您的電梯實體default,並再次使用查詢檢索;您需要確保一次只能在一個電梯上將值設置爲true。
  4. 您可以使用讓您可以存儲爲一個字符串,然後使用後取回物件的網址。這可能是最複雜的解決方案,我建議你嘗試其他選項之一。
+0

非常感謝您的回答和替代方法,@ Paulw11。你爲我節省了浪費時間的時間。 – Jim

0

不,你不能這樣做。您不能將用戶默認值中的Core Data對象保存。它只能保存在它的數據庫中。

0

可存儲類型NSUserDefaultsNSUserDefaults類非常類似於所謂的屬性列表(又名plist)。它可能只是一個plist的奇特界面,或者可能更多,我不完全確定。儘管如此,plists限制了他們可以存儲什麼樣的對象。六種類型的Plist可以存儲有:

  • NSData的
  • 的NSString
  • 的NSNumber
  • 的NSDate
  • 的NSArray
  • 的NSDictionary

所以,你需要在NSKeyedArchiver使用。

let ArchvieArr = NSMutableArray() 
ArchvieArr.addObject(NSKeyedArchiver.archivedDataWithRootObject(LiftObj)). 
NSUserDefaults.standardUserDefaults().setObject(ArchvieArr, forKey: "savedArray") 
0

這兩個是完全兩回事。NSUserDefault存儲的光數據片段,其中NSManagedObject存儲光或數據的重量,且比NSUserDefault非常快的用於存儲和檢索的目的。

NSManagedObject -> NSManagedObject鏈接coredata。 你應該把它存儲元件的大名單。至於你的最後一個問題,沒有什麼阻止您使用這兩個核心數據和後端存儲數據。事實上,那裏有框架來促進這一點。

NSUserDefaults -> NSUserDefaults是一類,它允許不同的數據類型的簡單存儲。它非常適合您需要在應用程序啓動或設備重新啓動之間持續存在的小部分信息。 NSUserDefaults不足以可靠地存儲和查詢大量的數據。這是suggestable如果你有一個後端(服務器上的數據庫)來存儲事件及其受邀者堅持的用戶信息的一致性(如果用戶返回到您的應用程序從其他應用程序支持的設備記錄那麼他會得到所有的信息,他存儲)。 NSUserDefaults支持以下數據類型: NSStringNSNumberNSDateNSArrayNSDictionaryNSData

希望它會幫助你。

相關問題