如何更新已保存在 Swift 中的 CoreData 条目? [英] How do you update a CoreData entry that has already been saved in Swift?
问题描述
我不确定我在这里做错了什么,但是当我将第一次保存到 coredata 中时,它工作得很好.当我尝试覆盖它时,它没有.
I'm not sure what I'm doing wrong here, but when I save the first time into coredata, it works just fine. When I try to overwrite that, it doesn't.
func testStuff() {
var token = loadLoginData()
println("Token (token)")
saveLoginData("New Token")
var newToken = loadLoginData()
println("Token (newToken)")
}
func saveLoginData(accessToken: String) {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
// save data to core data
var loginData = NSEntityDescription.insertNewObjectForEntityForName("LoginData", inManagedObjectContext: context) as NSManagedObject
loginData.setValue(accessToken, forKey: "accessToken")
context.save(nil)
println("Done saving user")
}
/* Output
Token Optional("12345")
Done saving user
Token Optional("12345")
*/
加载登录数据功能调用 saveLogin 数据的函数
Load Login Data Func the function that calls on saveLogin data
func loadLoginData() -> String? {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "LoginData")
request.returnsObjectsAsFaults = false
var results: NSArray = context.executeFetchRequest(request, error: nil)!
if (results.count > 0) {
var userData: NSManagedObject = results[0] as NSManagedObject
var accessToken: String = userData.valueForKey("accessToken") as String
return accessToken.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
} else {
println("0 results returned, potential error")
return nil
}
}
推荐答案
由于 batchupdate 在较大的数据块中更有用,我认为这是一种更微妙的方法.
Since batchupdate is more useful in larger chunks of data, I think this is a more subtle approach.
func saveLoginData(accessToken: String, userName: String) {
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context: NSManagedObjectContext = appDel.managedObjectContext!
var fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "LoginData")
fetchRequest.predicate = NSPredicate(format: "userName = %@", userName)
if let fetchResults = appDel.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSManagedObject] {
if fetchResults.count != 0{
var managedObject = fetchResults[0]
managedObject.setValue(accessToken, forKey: "accessToken")
context.save(nil)
}
}
}
如果我没记错的话,我试着把它翻译成你的情况,但还没有测试过.
I tried to translate it a bit to your situation if I'm not mistaken, but have not tested it.
fetchRequest.predicate
基本上是在实体 LoginData
的属性 userName
上设置过滤器,使用您在调用时输入的(用户)名称功能.假设在这个例子中你只有一个同名的 username
.然后它使用给定的过滤器执行 fetchrequest
,因此您可以使用 setValue
更改它的值,并在调用函数时输入 accesToken
.之后的代码: if fetchResults.count != 0
,仅在 username
存在时执行.
fetchRequest.predicate
basically sets the filter on the attribute userName
from the entity LoginData
, with the (user)name you enter when calling the function. Assuming in this example you have only one username
with the same name. Then it does a fetchrequest
with the given filter, so you can change it's value with setValue
with the accesToken
you also enter when calling the function. The code after: if fetchResults.count != 0
, only executes when the username
exists.
这篇关于如何更新已保存在 Swift 中的 CoreData 条目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!