2016-12-01 170 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

希望它会帮助你。

相关问题