尽管有与此类似的主题,但是在堆栈溢出中,没有明确的问题答案,我将在下面进行描述。为简单起见,我将简化实体。因此:核心数据中有两个实体:
第一个名为 Person 的实体,具有以下属性:
名
姓氏
城市
第二实体:国家/地区,属性:
城市
资本
这个想法是,在一个视图控制器中,用户通过表格为第二个实体添加值-填写国家的城市和首都信息。
在其他视图控制器中,用户填写名字和姓氏,但从选择器视图中选择城市,而该选择器视图已从其他视图控制器中添加的数据中填充。
在第三个视图控制器中,我想获取第一个向其添加资金的实体(表视图控制器中的所有信息),例如如果第一个实体包含数据:
John |琼斯|芝加哥
默认情况下,第二个应包含以下数据:
芝加哥|华盛顿州
如何将“华盛顿”分配给“约翰”?
类似于此问题,但那里没有明确的答案:Selecting columns from different entities
答案 0 :(得分:1)
我想出了下一个数据库方案:
Entity:
City
Attributes:
id: Integer 16
name: String
Relationships:
[o] capitalOfCountryOptional: Country, inverse: capital
[o] country: Country, inverse: cities
[m] people: Person, inverse: city
Country
Attributes:
id: Integer 16
name: String
Relationships:
[o] capital: City, inverse: capitalOfCountryOptional
[m] cities: Person, inverse: city
Person
Attributes:
id: Integer 16
firstName: String
flastName: String
Relationships:
[o] city: City, inverse: people
一旦您需要一些人的信息并且您知道ID:
现在,您可以创建所有需要的对象并将其设置为关系:
let country = ... Ukraine
let city = ... Lviv
let capital = ... Kyiv
let person = ... John Doe
country.capital = capital
city.country = country
person.city = city
然后您需要保存您的上下文,然后可以检索人的信息:
import CoreData
public class MOPerson: NSManagedObject {
static func getPerson(id: Int16) -> MOPerson? {
let request: NSFetchRequest<MOPerson> = MOPerson.fetchRequest()
request.predicate = NSPredicate(format: "\(#keyPath(MOPerson.id)) = %@", NSNumber(int16: id))
request.fetchLimit = 1
let result: MOPerson? = (try? CoreDataController.shared.managedContext.fetch(request))?.first
return result
}
}
示例:
if let person = MOPerson.getPerson(id: 1) {
print("Person: \(person.firstName), capital: \(person.city?.country?.capital?.name ?? "not defined")")
}