【问题标题】:Is it possible to save an NSManagedObject in NSUserDefaults?是否可以在 NSUserDefaults 中保存 NSManagedObject?
【发布时间】:2016-12-01 05:46:49
【问题描述】:

我在 userDefaults 中保存 NSManagedObject 时遇到困难,我想知道 a) 我应该尝试这样做还是这不是合适的方法,或者 b) 如果它是合适的方法,我怎么能得到它可以工作吗?

我正在用 Swift 2.3 编写我的应用程序,它有一些用户默认选项,其中一个是默认的“提升”(如举重,例如“卧推”、“挺举”、“倾斜”卧推')。我实际上是将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个提升事件都是可用的提升类型之一(我将为此建立适当的关系)。

这是带有属性的扩展:

extension Lift {

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

   }

还有带有 Xcode 抱怨的 Lift 实体:

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 和什么协议要求。但是后来我看到threadsNSManagedObjects 应该 存储在userDefaults 中,但我不知道这是不是真的。

我已经为此花费了几个小时,所以在我继续之前,可以/应该这样做吗?

【问题讨论】:

    标签: ios swift core-data nsuserdefaults nsmanagedobject


    【解决方案1】:

    不,您不应将NSManagedObject 存储在NSUserDefaults 中。 Core Data 是一种对象持久化技术,因此尝试以其他格式持久化 NSManagedObject 是没有意义的。

    您可以使用的替代方案很少:

    1. 您可以简单地将电梯名称存储在用户默认值中,然后查询此名称以从 Core Data 中获取对象。如果电梯名称不是唯一的,这可能对您不起作用
    2. 您可以向 Lift 实体添加标识符属性,并在该属性中存储类似 UUID 字符串的内容;然后,您可以将相同的字符串存储在 UserDefaults 中。这将确保唯一选择一个对象。
    3. 您可以向您的 Lift 实体 default 添加一个新的布尔属性,然后再次使用查询来检索它;您需要确保一次仅在一次电梯上将该值设置为 true。
    4. 您可以使用managedObject.objectId.uriRepresentation 获取可以存储为字符串的URL,然后用于稍后检索对象。这可能是最复杂的解决方案,我建议您尝试其他选项之一。

    【讨论】:

    • 非常感谢@Paulw11 的回答和替代方法。您为我节省了数小时的浪费时间。
    【解决方案2】:

    不,你不能这样做。您不能将 Core Data 对象保存在 User Defaults 中。它只能保存在它的数据库中。

    【讨论】:

      【解决方案3】:

      这两者完全是两个不同的东西。 NSUserDefault 存储轻量数据,NSManagedObject 存储轻量或大量数据,并且比 NSUserDefault 存储和检索目的。

      NSManagedObject -> NSManagedObject 链接到 coredata。 您应该使用它来存储大量元素。至于您的最后一个问题,没有什么可以阻止您同时使用 Core Data 和后端来存储数据。事实上,有一些框架可以帮助实现这一点。

      NSUserDefaults -> NSUserDefaults 是一个允许简单存储不同数据类型的类。它非常适合您需要在应用程序启动或设备重启之间保留的少量信息。 NSUserDefaults 不足以存储和查询海量数据。建议您有一个后端(服务器上的数据库)来存储事件及其被邀请者以保持事件的一致性用户信息(如果用户从其他应用支持设备登录回您的应用,那么他将获得他存储的所有信息)。 NSUserDefaults 支持以下数据类型: NSStringNSNumberNSDateNSArrayNSDictionaryNSData

      希望对你有所帮助。

      【讨论】:

        【解决方案4】:

        NSUserDefaults 中的可存储类型。 NSUserDefaults 类的行为非常类似于称为属性列表(又名 plist)的东西。它可能只是一个 plist 的精美界面,或者可能更多,我不完全确定。尽管如此,plist 可以存储的对象类型是有限的。 plist 可以存储的六种类型是:

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

        所以,你需要使用NSKeyedArchiver

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多