gpt4 book ai didi

swift - 核心数据获取关系不起作用

转载 作者:行者123 更新时间:2023-11-30 13:48:49 25 4
gpt4 key购买 nike

我在从关系中获取数据时遇到问题。我有一项调查,我想将答案、用户 ID 和结果保存到核心数据中,并在下次启动应用程序时获取数据。它们在数组中。其中每个都将被转换为 NSManagedObject“Wert”,如果它是结果,则转换为属性“valueInt”;如果它是答案或 userId,则转换为“valueString”。

extension Wert {

@NSManaged var valueInt: NSNumber?
@NSManaged var valueString: String?
}

之后,它将作为答案、结果或用户 ID 上的 NSSet 保存在 NSManagedObject“消息”中。

extension Message {

@NSManaged var absenderId: String?
@NSManaged var absenderName: String?
@NSManaged var datum: NSDate?
@NSManaged var gruppenId: String?
@NSManaged var image: NSData?
@NSManaged var latitude: NSNumber?
@NSManaged var longitude: NSNumber?
@NSManaged var messageId: String?
@NSManaged var question: String?
@NSManaged var sound: NSData?
@NSManaged var text: String?
@NSManaged var answers: NSSet?
@NSManaged var results: NSSet?
@NSManaged var userIDs: NSSet?
}

我认为这是有效的,因为在“addObjectsFromArray”AnswerSet 包含一些值之后。

func saveCoreData(AbsenderName: String, AbsenderID: String,  Text: String?, Image: NSData?, Datum: NSDate, Latitude: Double?, Longitude: Double?, MessageId: String, Sound: NSData?, question: String?, answers : [String]?, results : [Int]?, userIDs: [String]?) {

let newMessage = NSEntityDescription.insertNewObjectForEntityForName("Message", inManagedObjectContext: context) as NSManagedObject
newMessage.setValue(AbsenderID, forKey: "absenderId")
newMessage.setValue(AbsenderName, forKey: "absenderName")
newMessage.setValue(Text, forKey: "text")
newMessage.setValue(Image, forKey: "image")
newMessage.setValue(Latitude, forKey: "latitude")
newMessage.setValue(Longitude, forKey: "longitude")
newMessage.setValue(Datum, forKey: "datum")
newMessage.setValue(GroupId, forKey: "gruppenId")
newMessage.setValue(MessageId, forKey: "messageId")
newMessage.setValue(Sound, forKey: "sound")

if question != nil && answers != nil && results != nil && userIDs != nil {

newMessage.setValue(question, forKey: "question")

var AnswersArray = [NSManagedObject]()
var ResultsArray = [NSManagedObject]()
var userIDsArray = [NSManagedObject]()

for var index = 0; index < answers?.count ; ++index {
let newWert = NSEntityDescription.insertNewObjectForEntityForName("Wert", inManagedObjectContext: context) as NSManagedObject
newWert.setValue(answers![index], forKey: "valueString")
AnswersArray.append(newWert)
}


for var index = 0; index < results?.count ; ++index {
let newWert = NSEntityDescription.insertNewObjectForEntityForName("Wert", inManagedObjectContext: context) as NSManagedObject
newWert.setValue(results![index], forKey: "valueInt")
ResultsArray.append(newWert)
}

for var index = 0; index < userIDs?.count ; ++index {
let newWert = NSEntityDescription.insertNewObjectForEntityForName("Wert", inManagedObjectContext: context) as NSManagedObject
newWert.setValue(userIDs![index], forKey: "valueString")
userIDsArray.append(newWert)
}



let answersSet = newMessage.mutableSetValueForKey("answers")
let resultsSet = newMessage.mutableSetValueForKey("results")
let userIdsSet = newMessage.mutableSetValueForKey("userIDs")

answersSet.addObjectsFromArray(AnswersArray)
resultsSet.addObjectsFromArray(ResultsArray)
userIdsSet.addObjectsFromArray(userIDsArray)


}



do {
try context.save()

}
catch _ {

print("Error")
}

}

但是当我尝试使用 mutableSetValueForKey() 获取保存的值时,它们包含 0 个对象。其他一切都正常。

func loadCoreData() -> Int {

var x : [AnyObject] = [AnyObject]()

let request = NSFetchRequest(entityName: "Message")
request.resultType = NSFetchRequestResultType.DictionaryResultType
request.predicate = NSPredicate(format: "gruppenId = %@", GroupId)
let sort1 = NSSortDescriptor(key: "datum", ascending: true)
request.sortDescriptors = [sort1]



do {

x = try context.executeFetchRequest(request)

for (var i = 0 ; i < x.count; ++i ) {




let Absender = x[i].valueForKey("absenderName") as! String
let AbsenderID = x[i].valueForKey("absenderId") as! String
let Text : String? = x[i].valueForKey("text") as? String
let Image : NSData? = x[i].valueForKey("image") as? NSData

let Sound : NSData? = x[i].valueForKey("sound") as? NSData

let Date : NSDate = x[i].valueForKey("datum") as! NSDate
let GruppenID : String = x[i].valueForKey("gruppenId") as! String
let MessageID : String = x[i].valueForKey("messageId") as! String

let longitude : Double? = x[i].valueForKey("longitude") as? Double
let latitude : Double? = x[i].valueForKey("latitude") as? Double

let question : String? = x[i].valueForKey("question") as? String
let answers = x[i].mutableSetValueForKey("answers") as? NSMutableSet
let results = x[i].mutableSetValueForKey("results") as? NSMutableSet
let userIds = x[i].mutableSetValueForKey("userIDs") as? NSMutableSet

}
}
}

最佳答案

看起来答案、结果等都是一对多的关系。在这种情况下,简单地设置一对一关系总是更安全(也更简洁)。

因此,您可以简单地使用逆关系,而不是维护一个笨拙的数组并处理 mutableSetValueForKey:

newWert.message = newMessage

注意:请采用使用 lowerCase 变量名称的约定,以避免与类名称混淆。

NB2:我强烈建议使用 NSManagedObject 子类并使用 dot.notation 来设置和获取值。轻轻一击,您在上面多行代码中定义的所有变量都将变得完全多余。

关于swift - 核心数据获取关系不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com