#ios #swift #xcode #core-data #relationship
#iOS #swift #xcode #основные данные #связь
Вопрос:
Мне очень сложно понять, как извлекать значения отношений между объектами. У меня есть объект Food и объект Meal. В демонстрационных целях я просто перечислил по 1 атрибуту для каждого. Название для еды и белка для еды. Мои отношения — это еда и еда с обратной зависимостью, многие ко многим. Что я хочу иметь возможность сделать, так это получить блюдо и вернуть значение белка, связанное с этим блюдом. В конечном итоге я буду получать питание по дате, а затем извлекать информацию о питании из этого приема пищи. Решение, которое я нашел, возвращает больше, чем просто значение, как вы можете видеть на картинке метки симулятора. Пожалуйста, любая помощь будет очень признательна! У меня такое чувство, что есть более простой способ сделать то, что я пытаюсь сделать, но я искал часами и не могу понять это.
Я пытался публиковать изображения, но это мне не позволит, поэтому я опубликую свой код и то, что происходит.
ViewController.swift
import UIKit
import CoreData
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
//================================
//CREATE MEAL AND FOOD
//================================
let newMeal = NSEntityDescription.insertNewObject(forEntityName: "Meal", into: context) as! Meal
newMeal.title = "Meal 1"
let newFood = NSEntityDescription.insertNewObject(forEntityName: "Food", into: context) as! Food
newFood.protein = "20"
newFood.setValue(newMeal, forKey: "meal")
//================================
//FETCH REQUEST
//================================
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Meal")
let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]
request.returnsObjectsAsFaults = false
do {
//===============================
//EXTRACT RELATIONSHIP DATA
//==============================
let results = try context.fetch(request) as NSArray
for res in results {
let data = res as! Meal
let item = data.food
let strs = item.value(forKey: "protein")
self.label.text = "(strs)"
}
} catch {
print ("error")
}
}
Мой ярлык отображает это…
{(
20
)}
Мне нужно просто вытащить ’20’. Пытаюсь установить значение label.text в str как! строка также не будет работать. Какие-либо рекомендации?? Большое вам спасибо
Ответ №1:
Будет ли сделано следующее?
self.label.text = strs
Комментарии:
1. Можете ли вы проверить тип «элемента» при трассировке? Что это?
2. О какой переменной вы говорите?
3. Пусть элемент = данные. еда (еда — это переменная отношения между 2 объектами)
4. Проверьте тип «strs». Я думаю, это набор.
5. Вы можете проверить свою модель данных (в «Meal.h») и преобразовать «item» в строку на основе типа «food» в классе «Meal», а затем присвоить ее label.text .
Ответ №2:
Я понял это…..
import UIKit
import CoreData
class ViewController: UIViewController {
var item:NSSet = []
var strs:NSSet = []
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
//================================
//CREATE MEAL AND FOOD
//================================
let newMeal = NSEntityDescription.insertNewObject(forEntityName: "Meal", into: context) as! Meal
newMeal.title = "Meal 1"
let newFood = NSEntityDescription.insertNewObject(forEntityName: "Food", into: context) as! Food
newFood.protein = "20"
newFood.setValue(newMeal, forKey: "meal")
//================================
//FETCH REQUEST
//================================
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Meal")
let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]
request.returnsObjectsAsFaults = false
do {
//===============================
//EXTRACT RELATIONSHIP DATA
//==============================
let results = try context.fetch(request) as! [Meal]
for res in results {
item = res.food
strs = item.value(forKey: "protein") as! NSSet
let array = strs.allObjects
print(array[0])
self.label.text = String(format: "%@", array[0] as! CVarArg)
}
} catch {
print ("error")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Спасибо за помощь