在 NSUserDefaults 中保存 NSManagedObject [英] Saving NSManagedObject in NSUserDefaults

查看:60
本文介绍了在 NSUserDefaults 中保存 NSManagedObject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好(抱歉我的英语不好,我是法国人),

Hello everyone (sorry for my bad english, I'm French),

我正在尝试将我的 NSManagedObject 放入 NSUserDefaults 以检索它的关系.基本上我使用了 NSCoding 并且我已经实现了所需的方法,但是因为它是 NSManaged 对象,所以 init 方法的签名是: init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?).

I'm trying to put my NSManagedObject into NSUserDefaults to retrieve it with its relationships. Basically I used NSCoding and I had implemented the required method, but because it's NSManaged objects, the signature of the init method it's : init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?).

消息是'NSInvalidArgumentException',原因:'非法尝试在不同上下文中的对象之间建立关系'商店'"

The message is "'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'shop' between objects in different contexts"

如果我评论 Address 中的行:self.shop = shop,它会一次又一次地为我创建我的实体..

If I comment the line in Address : self.shop = shop, it's creating me my entity again and again..

这是我的代码:

把商店放在 NSUserDefaults 中:

let selectedShop = shopFetchedResultsController!.fetchedObjects![indexPath.row] as! Shop
let encodedShop = NSKeyedArchiver.archivedDataWithRootObject(selectedShop)
NSUserDefaults.standardUserDefaults().setObject(encodedShop, forKey: "currentShop")

并检索它:

let encodedShop = NSUserDefaults.standardUserDefaults().objectForKey("currentShop") as! NSData
let currentShop = NSKeyedUnarchiver.unarchiveObjectWithData(encodedShop) as! Shop

商店实体:

import Foundation
import CoreData

@objc(Shop)
class Shop: NSManagedObject, NSCoding {

@NSManaged var name: String
@NSManaged var phoneNumber: String
@NSManaged var address: Address
@NSManaged var products: NSSet

// MARK: - Managed Object Context Insertable
class var entityName: String {
    return "Shop"
}

struct Attributes {
    static let Name = "name"
    static let PhoneNumber = "phoneNumber"
    static let Address = "address"
    static let Products = "products"
}

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
    super.init(entity: entity, insertIntoManagedObjectContext: context)
}

convenience init(name:String, phoneNumber:String, address:Address,  products:NSSet) {
    self.init(entity: NSEntityDescription.entityForName("Shop", inManagedObjectContext: ManagedObjectContext.defaultContext)!, insertIntoManagedObjectContext: ManagedObjectContext.defaultContext)
    self.name = name
    self.phoneNumber = phoneNumber
    self.address = address
    self.products = products

}

required convenience init(coder aDecoder: NSCoder) {
    let name = aDecoder.decodeObjectForKey("name") as! String
    let phoneNumber = aDecoder.decodeObjectForKey("phoneNumber") as! String
    let address = aDecoder.decodeObjectForKey("address") as! Address
    let products = aDecoder.decodeObjectForKey("products") as! NSSet
    self.init(name: name, phoneNumber: phoneNumber, address: address,  products: products)
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(name, forKey: "name")
    aCoder.encodeObject(phoneNumber, forKey: "phoneNumber")
    aCoder.encodeObject(address, forKey: "address")
    aCoder.encodeObject(products, forKey: "products")
}

地址实体:

class Address: NSManagedObject, NSCoding {

@NSManaged var city: String
@NSManaged var country: String
@NSManaged var ext: String?
@NSManaged var number: NSNumber?
@NSManaged var postalCode: String
@NSManaged var street: String
@NSManaged var customers: NSSet
@NSManaged var shop: Shop

// MARK: - Managed Object Context Insertable
class var entityName: String {
    return "Address"
}

struct Attributes {
    static let City = "city"
    static let Country = "country"
    static let Ext = "ext"
    static let Number = "number"
    static let PostalCode = "postalCode"
    static let Street = "street"
    static let Customers = "customers"
    static let Shop = "shop"
}

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
    super.init(entity: entity, insertIntoManagedObjectContext: context)
}

convenience init(city:String, country:String, ext:String?, number:NSNumber?, postalCode:String, street:String, customers: NSSet, shop: Shop) {
    self.init(entity: NSEntityDescription.entityForName(Address.entityName, inManagedObjectContext: ManagedObjectContext.defaultContext)!, insertIntoManagedObjectContext: ManagedObjectContext.defaultContext)
    self.city = city
    self.country = country
    self.ext = ext
    self.number = number
    self.postalCode = postalCode
    self.street = street
    self.customers = customers
   // self.shop = shop
}

required convenience init(coder aDecoder: NSCoder) {
    let city = aDecoder.decodeObjectForKey("city") as! String
    let country = aDecoder.decodeObjectForKey("country") as! String
    let ext : String? = aDecoder.decodeObjectForKey("ext") as? String
    let number : NSNumber? = aDecoder.decodeObjectForKey("number") as? NSNumber
    let postalCode = aDecoder.decodeObjectForKey("postalCode") as! String
    let street = aDecoder.decodeObjectForKey("street") as! String
    let customers = aDecoder.decodeObjectForKey("customers") as! NSSet
    let shop = aDecoder.decodeObjectForKey("shop") as! Shop
    self.init(city: city, country: country, ext: ext, number: number, postalCode: postalCode, street: street, customers: customers, shop: shop)
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(city, forKey: "city")
    aCoder.encodeObject(country, forKey: "country")
    aCoder.encodeObject(ext, forKey: "ext")
    aCoder.encodeObject(number, forKey: "number")
    aCoder.encodeObject(postalCode, forKey: "postalCode")
    aCoder.encodeObject(street, forKey: "street")
    aCoder.encodeObject(customers, forKey: "customers")
    aCoder.encodeObject(shop, forKey: "shop")
}

我什至不知道这是否是实现我的实体的正确方法..

I don't even know if it's the correct way to implement my entities..

有关信息,我使用 Swift2 和 Xcode7.如果您需要更多详细信息,请告诉我,我可以为您提供其他东西!

For information, I use Swift2 and Xcode7. If you need more details, just tell me, I can provide you other things !

非常感谢您的帮助!相信我,我花了 3 天时间来解决这个问题...

Thank you a lot for your help ! Trust me, I spend 3 days on that without solutions...

推荐答案

你永远不会这样做.核心数据对象只能保存在 DB 中.但是,您可以使用 NSUserDefaults 来保存您以后可以检索并用于从核心数据中获取数据的任何键.

You never do this. Core data objects are meant to be saved in DB only. However, you can use NSUserDefaults to save any key which you can later retrieve and use to fetch data from core data.

这篇关于在 NSUserDefaults 中保存 NSManagedObject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆