【发布时间】:2016-03-26 10:31:17
【问题描述】:
核心数据关系仍然存在问题。
例子:
实体用户(idU,NameU = 属性) 实体设备(idD,NameD = 属性)
core data model 问题:当我创建一个链接到用户的新设备时,我遇到了 Nsset 问题。我认为这与多对多关系有关
还是不行更新:
代码:
@IBAction func addDeviceBoutonAction(sender: AnyObject) {
print("Creation Device debut")
var nbCharacteres = Int((newDeviceNameTextField.text?.characters.count)!)
if currentUserName == "" {
print("Erreur creation device / currentUserName = Vide --> Abort")
}
else if nbCharacteres == 0 {
print("Erreur creation device / newDeviceNameTextField = Vide --> Abort")
}
else
{
// init du MOC
let MOC = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
// creation de la requete sur l'entité User avec un predicat : on recupere que les infos du user selectionné dans le pickerViewUser (on
// travaille avec la variable globale currentUserName qui a été initialisée lors du didSelectRow du pickerViewUser)
let fetchRequestUser = NSFetchRequest(entityName: "User")
print("Creation device / trace currentUserName = \(currentUserName)")
let userPredicate = NSPredicate(format: "userName == %@", currentUserName)
// On colle le predicat dans la requete
fetchRequestUser.predicate = userPredicate
var requestError: NSError?
let existingUser = (try! MOC.executeFetchRequest(fetchRequestUser)) as! [User]
print("Creation device / trace existingUser[0].userName = \(existingUser[0].userName)")
// il faut passer par l'ID plutot que le nom
// firstUserFound de type User
let firstUserFound = existingUser[0]
print("Creation device firstUserFound = \(firstUserFound)")
// Insertion d'un nouveau Device dans la base (relationship n to n entre Device et User)
let existingDevicesForThisUser = firstUserFound.mutableSetValueForKey("device")
// Create Item Record
let newDevice = NSEntityDescription.insertNewObjectForEntityForName("Device",inManagedObjectContext: MOC) as! Device
//if let newDevice = createRecordForEntity("Device", inManagedObjectContext: MOC) {
// Set Attributes and values
newDevice.setValue(NSUUID().UUIDString, forKey: "deviceId")
newDevice.setValue(newDeviceNameTextField.text, forKey: "deviceName")
newDeviceNameTextField.text = ""
self.view.endEditing(true)
//newDevice.setValue("Device \(newDevice.count + 1)", forKey: "deviceId")
// Set Relationship
print("avant relationhips")
newDevice.setValue(firstUserFound, forKey: "users")
错误: 创造器登场
创建设备/trace currentUserName = toto
创建设备/trace existingUser[0].userName = Optional("toto")
创建设备firstUserFound =(实体:用户;id:0xd000000000080000;数据:{ 设备=“”; 用户 ID = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; 用户名 = toto; })
前卫的关系
2016-04-02 13:55:13.065 testcoredatarelationships[1568:370426] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“对多关系不可接受的值类型:属性 =“用户";所需类型 = NSSet;给定类型 = testcoredatarelationships.User;值=(实体:用户;ID:0xd000000000080000;数据:{ 设备=“”; 用户 ID = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; 用户名 = toto; })。 * 首先抛出调用栈:
错误的行: newDevice.setValue(firstUserFound, forKey: "users")
扩展设备{
@NSManaged var deviceId: String?
@NSManaged var deviceName: String?
@NSManaged var cards: NSSet?
**@NSManaged var users: NSSet?**
}
【问题讨论】:
-
您是否已经拥有 Jack 实例?你的关系是双向的(应该是双向的)吗?显示实体模型的图片。
-
嗨 Wain,事实上,现在它只是虚拟数据。我放了核心模型(有些字段不一样但应该没问题)
-
我想创建一个真实的例子来了解实体之间的关系是如何工作的。所以我用这个简单的核心数据创建了一个简单的视图,但我无法实现它(需要帮助才能完成)
标签: swift core-data relationship