如何更新已保存在 Swift 中的 CoreData 条目? [英] How do you update a CoreData entry that has already been saved in Swift?

查看:15
本文介绍了如何更新已保存在 Swift 中的 CoreData 条目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不确定我在这里做错了什么,但是当我将第一次保存到 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆