在 NSUserDefaults 中保存 NSManagedObject [英] Saving NSManagedObject in NSUserDefaults
问题描述
大家好(抱歉我的英语不好,我是法国人),
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屋!