У меня есть проект, использующий CoreData, я создаю пользовательский объект Pi c Моего основного объекта данных
Это класс, который я использовал в атрибуте items
public class Item: NSObject, NSCoding {
public var name: String = ""
public var price: Int = 0
public var Quan: Int = 0
enum Key:String {
case name = "name"
case price = "price"
case Quan = "Quan"
}
init(name: String, price: Int , Quan: Int) {
self.name = name
self.price = price
self.Quan = Quan
}
public override init() {
super.init()
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: Key.name.rawValue)
aCoder.encode(price, forKey: Key.price.rawValue)
aCoder.encode(Quan, forKey: Key.Quan.rawValue)
}
public required convenience init?(coder aDecoder: NSCoder) {
let mName = aDecoder.decodeObject(forKey: Key.name.rawValue)
let mPrice = aDecoder.decodeInt32(forKey: Key.price.rawValue)
let mQuan = aDecoder.decodeInt32(forKey: Key.Quan.rawValue)
self.init(name: mName as! String, price: Int(mPrice) , Quan: Int(mQuan) )
}
}
Это мой код, когда я хочу сохранить и получить
func Save()
{
let UserEntity = NSEntityDescription.entity(forEntityName: "OrdersHistory", in: context)
let cmsg = NSManagedObject(entity: UserEntity!, insertInto: context) as! OrdersHistory
var itemarray : [Item] = []
for i in self.items
{
itemarray.append(Item(name: String(i.item!), price: Int(i.price), Quan: Int(i.quan)))
}
let data = [ "orderunique" : uniq , "receiptnumber" : result[0] , "date" : NSDate() as Date , "items" : itemarray] as [String : Any]
cmsg.setValuesForKeys(data)
do
{
ad.saveContext()
print("Saved! ")
}
catch
{
print(error)
}
}
func fetch()
{
var HistoryList = [OrdersHistory]()
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "OrdersHistory")
do
{
HistoryList = try context.fetch(fetchRequest) as! [OrdersHistory]
} catch
{
}
}
до сих пор все в порядке! , но когда я хочу обновить или удалить указанный c объект внутри [элемента], я пытаюсь использовать этот метод, но это неправильно, поскольку он может только удалить NSMangedObject
(Невозможно преобразовать значение введите «Item» для ожидаемого типа аргумента «NSManagedObject»). См. ниже. Я отмечаю, где ошибка:
func delete()
{
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "OrdersHistory")
fetchRequest.predicate = NSPredicate(format: "orderunique = %@", "\(orderdetail.orderunique!)")
do
{
let MainObject = try context.fetch(fetchRequest) as! [OrdersHistory]
let ObjectToDelete = MainObject[0].items![0]
context.delete(ObjectToDelete) //// Give me this error : Cannot convert value of type 'Item' to expected argument type 'NSManagedObject'
}
}
Примечание: ошибка отображается, если я хочу удалить все элементы или элемент из элементов
есть идеи?